删除字符构造回文

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

如:

输入例子1:
abcda
google

 

输出例子1:
2
2

思路:回文串即正序和逆序一样的字符串,考虑将字符串S置逆后求其与原字符串的最长公共子序列,最后用总长度减去最长公共子序列的长度即是答案
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 string reverseStr(string str)
 5 {
 6     int begin=0;
 7     int end=str.size()-1;
 8     while(begin<=end){
 9         char tmp=str[begin];
10         str[begin]=str[end];
11         str[end]=tmp;
12         ++begin;
13         --end;
14     }
15     return str;
16 }
17 int max(int a, int b)
18 {
19     if(a>=b)return a;
20     else return b;
21 }
22 int LCS(string str1, string str2)
23 {
24     if(str1.size()==0 || str2.size()==0)return 0;
25     int **dp=new int* [str1.size()+1];
26     for(int i=0; i<str1.size()+1; ++i)
27     {
28         dp[i]=new int[str2.size()+1];
29     }
30     for(int i=0; i<str1.size()+1; ++i)dp[i][0]=0;
31     for(int j=0; j<str2.size()+1; ++j)dp[0][j]=0;
32     for(int i=1; i<str1.size()+1; ++i)
33     {
34         for(int j=1; j<str2.size()+1; ++j)
35         {
36             if(str1[i-1]==str2[j-1])dp[i][j]=dp[i-1][j-1]+1;
37             else dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
38         }
39     }
40     int result=dp[str1.size()][str2.size()];
41     for(int i=0; i<str1.size()+1; ++i)
42     {
43         delete[] dp[i];
44     }
45     delete[] dp;
46     return result;
47 }
48 int main()
49 {
50     string str1;
51     while(cin>>str1)
52     {
53         if(str1.size()<=1){
54             cout<<0<<endl;
55             continue;
56         }
57         string str2=reverseStr(str1);
58         cout<<str1.size()-LCS(str1, str2)<<endl;
59     }
60     return 0;
61 }

 

posted @ 2018-03-11 15:44  jeysin  阅读(263)  评论(0编辑  收藏  举报