回文字符串
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
输入
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
每行输出所需添加的最少字符数
样例输入
1
Ab3bd
样例输出
2
#include<stdio.h>
#include<string.h>
int f[1001][1001];
int main()
{
char str1[1001],str2[1001];
int ncases,i,j,k,len;
scanf("%d",&ncases);
while(ncases--)
{
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
scanf("%s",str1);
len=strlen(str1);
for(k=0,i=len-1;i>=0;i--)//**转置字符串**//
{
str2[k++]=str1[i];
}
for(i=0;i<=len;i++)
{
f[i][0]=f[0][i]=0;
}
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(str1[i-1]==str2[j-1])//**求最长公共子序列**//
{
f[i][j]=f[i-1][j-1]+1;
}
else
{
f[i][j]=f[i-1][j]>f[i][j-1]?f[i-1][j]:f[i][j-1];
}
}
}
printf("%d\n",len-f[len][len]);//**用长度减去最长公共子序列得到需要最少添加的字符数**//
}
return 0;
}
思路详解: 如上 ,把原序列逆序,然后再求出最长公共序列,用原序列的长度减去最长公共序列长度,便求出最少添加的字符数
NYOJ 37 回文序列
最新推荐文章于 2020-07-02 22:01:27 发布