描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
-
第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.
- 输出
-
每行输出所需添加的最少字符数
- 样例输入
-
1 Ab3bd
- 样例输出
-
2
思路:先将原序列逆序,得到一个新串,然后求出最长公共子序列,答案就是n-dp[n][n]
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define N 1006 6 char s1[N]; 7 char s2[N]; 8 int dp[N][N]; 9 int main() 10 { 11 int t; 12 scanf("%d",&t); 13 while(t--){ 14 memset(dp,0,sizeof(dp)); 15 scanf("%s",s1); 16 int len = strlen(s1); 17 int index = 0 ; 18 for(int i=len-1;i>=0;i--){ 19 s2[index++]=s1[i]; 20 } 21 for(int i=0;i<len;i++){ 22 for(int j=0;j<len;j++){ 23 if(s1[i]==s2[j]){ 24 dp[i+1][j+1]=dp[i][j]+1; 25 } 26 else{ 27 dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]); 28 } 29 } 30 } 31 printf("%d ",len-dp[len][len]); 32 } 33 return 0; 34 }