nyoj 题目37 回文字符串
回文字符串
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
- 第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000. - 输出
- 每行输出所需添加的最少字符数
- 样例输入
-
1 Ab3bd
- 样例输出
-
2
用动态规划来做此题,代码如下1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 6 char str[1005]; 7 int dp[1005][1005]; 8 9 int main(int argc, char const *argv[]) 10 { 11 int n; 12 scanf("%d",&n); 13 while(n--) { 14 scanf("%s",str); 15 memset(dp, 0, sizeof(dp)); 16 int len = strlen(str); 17 for(int l = 1; l < len; l++) { 18 for(int i = 0,j = l; i < len && j < len; i++,j++) { 19 if(str[i] == str[j]) { 20 dp[i][j] = dp[i+1][j-1]; 21 } 22 else { 23 dp[i][j] = min(dp[i+1][j],dp[i][j-1])+1; 24 } 25 } 26 } 27 printf("%d\n",dp[0][len-1]); 28 } 29 return 0; 30 }
dp[i][j]表示从i到j所需要添加的最小字符数。由长度为1的串一直推导整个字符串。