版权所有。所有权利保留。
欢迎转载,转载时请注明出处:
http://blog.csdn.net/xiaofei_it/article/details/17172891
把一个字符串变成回文串,最少要添加几个字符?
动态规划解:
f(i,j)表示s[i..j]变为回文串需要添加的最少字符数。
f(i,j)=0 if i>=j
f(i,j)=f(i+1,j-1) if i<j and s[i]==s[j]
f(i,j)=min(f(i,j-1),f(i+1,j))+1 if i<j and s[i]!=s[j]
代码如下:
#include <iostream> #include <string.h> using namespace std; #define min(a,b) ((a)<(b)?(a):(b)) int f[100][100]; int main() { string s; while (cin>>s) { memset(f,0,sizeof(f)); for (int i=s.length()-1;i>=0;i--) for (int j=i+1;j<s.length();j++) if (s[i]==s[j]) f[i][j]=f[i+1][j-1]; else f[i][j]=min(f[i][j-1],f[i+1][j])+1; cout<<f[0][s.length()-1]<<endl; } return 0; }