湘大oj-回文串问题练习
一.思路分析
假设原字符串是 s
,长度是 n
。
我们要在末尾添加一些字符,使整个字符串变成回文串。
那么,最终的回文串长度至少是 n
,最多是 2n-1
(极端情况是原字符串完全不回文,需要补几乎整个逆序串)。
关键点:
因为只能在末尾添加字符,所以原字符串的前面部分必须与末尾部分对称。
也就是说,原字符串最长的“后缀回文”部分可以保留,我们只需要补上前面不匹配的部分的逆序。
二.算法步骤
-
从
i = 0
到n-1
,检查子串s[i..n-1]
是否是回文。 -
找到第一个(最小的
i
)使得s[i..n-1]
是回文。 -
需要添加的字符数就是
i
(因为s[0..i-1]
需要逆序补到末尾)。
最终AC代码
#include<stdio.h>
#include<string.h>
int pd(char*s)
{int len=strlen(s);for(int i=0;i<len/2;i++){if(s[i]!=s[len-1-i])return 0;}return 1;
}
int main()
{int t;scanf("%d",&t);while(t--){char s[1010];scanf("%s",s);int n=0;int len=strlen(s);char si[1010];for(int j=0;j<len;j++){strncpy(si,s+j,len-j);si[len-j]='\0';if(pd(si)){printf("%d\n",j);break;}}}return 0;
}