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
",dp[0][len-1]);
28     }
29     return 0;
30 }

dp[i][j]表示从i到j所需要添加的最小字符数。由长度为1的串一直推导整个字符串。

原文地址:https://www.cnblogs.com/jasonJie/p/6092875.html