回文字符串
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
- 第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000. - 输出
- 每行输出所需添加的最少字符数
- 样例输入
-
1
Ab3bd
- 样例输出
-
2
【思路】
由之前做过的几题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,同时用编译器不会报错,但是往往忘记加两者不同的头文件,所以以后要注意这个,尽量统一用一种输入输出的方法。
不然,影响拿一血啊~