给定一个字符串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 }