【又见LCS】NYOJ-37 回文字符串
- 描述
- 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
- 第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000. - 输出
- 每行输出所需添加的最少字符数
- 样例输入
-
1 Ab3bd
- 样例输出
-
2
【思路】
由之前做过的几题LCS,不难看出,这道题的答案就是,将输入的字符串与其反转后的字符串求两者的LCS,然后字符串长度-LCS值便是答案。
LCS博客连接
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 #define max(a,b) a > b ? a : b 5 const int maxn = 1001; 6 int dp[maxn][maxn]; 7 char s1[maxn],s2[maxn]; 8 int main(){ 9 int n; 10 cin >> n; 11 while(n--){ 12 int i,j; 13 cin >> s1; 14 int len = strlen(s1); 15 for(i = len - 1,j = 0;i >= 0;i--,j++) 16 s2[j] = s1[i]; 17 for(i = 1;i <= len;i++){ 18 for(j = 1;j <= len;j++){ 19 if(s1[i - 1] == s2[j - 1]){ 20 dp[i][j] = dp[i - 1][j - 1] + 1; 21 } 22 else 23 dp[i][j] = max(dp[i][j - 1],dp[i - 1][j]); 24 } 25 } 26 cout << len - dp[len][len] << endl; 27 } 28 return 0; 29 } 30
【注意】
本来这题应该一次水过的,但是提交编译错误了1次,原因是一个代码中同时用了 scanf 与 cin,cout,同时用编译器不会报错,但是往往忘记加两者不同的头文件,所以以后要注意这个,尽量统一用一种输入输出的方法。
不然,影响拿一血啊~
梦想要一步步来!