问题 F: 【动态规划】回文字符串
时间限制: 1 Sec 内存限制: 128 MB提交: 23 解决: 15
[提交][状态][讨论版]
题目描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
输入
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
每行输出所需添加的最少字符数
样例输入
1
Ab3bd
样例输出
2
解题思路:方法是将字符串逆序,然后求两个字符串的最大公共子序列。
用原字符串长度减去最大公共子序列长度就是至少要添加的字符数。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a[1005][1005]; int main() { int n; char s1[1005],s2[1005]; scanf("%d",&n); for(int z=0;z<n;z++){ scanf("%s",s1+1); int len=strlen(s1+1); for(int i=1;i<=len;i++){ s2[i]=s1[len+1-i]; } for(int i=0;i<=len;i++){ a[i][0]=0; a[0][i]=0; } for(int i=1;i<=len;i++){ for(int j=1;j<=len;j++){ if(s1[i]==s2[j]){ a[i][j]=a[i-1][j-1]+1; }else{ a[i][j]=max(a[i-1][j],a[i][j-1]); } } } printf("%d ",len-a[len][len]); } return 0; }