一个字符串如果从左往右读和从右往左读都一样,那么这个字符串是一个回文串。例如:"abcba"
,"abccba"
。
蒜头君想通过添加字符把一个非回文字符串变成回文串。例如:"trit"
,可以添加一个'i'
变成回文串"tirit"
。请你用程序计算出,对于一个给定的字符串,最少需要添加几个字符,才能变成回文串。
输入格式
输入一个长度为 n(1 \leq n \leq 3000)n(1≤n≤3000) 的字符串。(字符串只包含字母)
输出格式
输出最少需要添加的字符个数,占一行。
样例输入
trit
样例输出
1
把回文串的顺序倒转后,与原串是一样的。
那么我们只要把给定的字符串顺序倒转与原串求最长公共子序列,再用字符串总长度减去最长公共子序列的长度就是相差的字符个数,也就是答案。
#include <iostream>#include <cstdio>
#include <cstring>
using namespace std;
char a[3010];
char b[3010];
int lcs[3010][3010];
int main()
{
memset(lcs,0,sizeof(lcs));
char x ;
int k=1;
while(scanf("%c",&x)==1&&x!=10)
{
a[k++]=x;
}
for(int i=1 ;i<k+1;i++)
{
b[i]=a[k-i];
}
for(int i=1 ;i<k+1;i++)
for(int j=1;j<k+1;j++)
{
if(a[i]==b[j])
lcs[i][j]=lcs[i-1][j-1]+1;
else
lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);
}
int sum = k-lcs[k][k];
printf("%d",sum);
return 0;
}