-
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
-
输入
-
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
- 每行输出所需添加的最少字符数 样例输入
-
1 Ab3bd
样例输出
-
2
-
第一行给出整数N(0<N<100)
if(a[i]=a[j]) d[i][j]=d[i+1][j-1]; 条件满足,可以取得情况 。 d[i][j]=min(d[i][j-1] , d[i+1][j])+1;必须最前或者最后补一个字符才回文(所有情况)
#include<stdio.h>
#include<vector>
#include<map>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int d[1100][1100];
int work(char a[])
{
int i,j,k,len;
len=strlen(a);
for(i=0;i<len;i++)
d[i][i]=0;
for(int p=1;p<len;p++)
{
for(i=0;i+p<len;i++)
{
j=i+p;
d[i][j]=1011;
if(a[i]==a[j])
d[i][j]=min(d[i+1][j-1],d[i][j]);
d[i][j]=min(d[i][j],min(d[i][j-1],d[i+1][j])+1);
}
}
}
int main()
{
int i,j,k,n,m;
char a[1011];
scanf("%d",&n);
while(n--)
{
memset(d,0,sizeof(d));
scanf("%s",a);
int len=strlen(a);
work(a);
//printf("%d\n",d[2][4]);
//printf("%d\n",d[1][4]);
printf("%d\n",d[0][len-1]);
}
return 0;
}