【又见LCS】NYOJ-37 回文字符串

题目链接

回文字符串

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"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,同时用编译器不会报错,但是往往忘记加两者不同的头文件,所以以后要注意这个,尽量统一用一种输入输出的方法。

  不然,影响拿一血啊~

原文地址:https://www.cnblogs.com/zhengbin/p/4467697.html