题目描述#
一个字符串,你可以在这个字符串后面拼接若干个任意字符,使得这个字符串成为回文串。
回文串,即字符串从左到右,从右到左读是一样的。
比如字符串abcbc,你可以在最后拼接2个字符ba,使得字符串变为回文串abcbcba,
现在给你一个只含英文小写字母的字符串,请问在后面拼接多少个字符会使得其变成回文串。
输入格式#
第一行是一个整数,表示样例的数量。每个样例为一个字符串,只含英文小写字母,长度不超过1000。
输出格式#
依次输出每个样例的结果,为一个整数。
样例输入#
3
a
ab
abc
样例输出#
0
1
2
解题思路:找最长回文子串,且回文子串的最后一位是字符串末尾字符
方法一:参考之前写的文章
分回文子串是奇数和偶数讨论,注意考虑越界情况
(1)奇数 left=i-1,right=i+1
向两侧扩散 a[left]=a[right],left--,right++
len=right-left-1与len比大小,大于则更新len和start的值
(2)偶数,left=i.right=i+1
与奇数同理
注意点: if(right!=len)continue;
不然会wa
#include<stdio.h>
#include<string.h>
//判断是否是回文串
int Judge(char s[],int len){
int flag=1,i;
for(i=0;i<=len/2;i++){
if(s[i]!=s[len-i-1]){
flag=0;
break;
}
}
return flag;
}
int main(){
int T;
scanf("%d",&T);
char s[1005]={};
while(T--){
scanf("%s",s);
int len=strlen(s);
int cnt=0,i,j;
if(Judge(s,len))cnt=0;
else{
int start=0,left,right,max=0;
//回文子串为奇数
for(i=0;i<len;i++){
left=i-1,right=i+1;
while(left>=0&&right<len&&s[left]==s[right]){
//向两侧扩散
left--;
right++;
}
if(right!=len)continue;
if(right-left-1>=max){
max=right-left-1;
start=left+1;
}
}
//回文子串为偶数
for(i=0;i<len;i++){
left=i,right=i+1;
while(left>=0&&right<len&&s[left]==s[right]){
left--;
right++;
}
if(right!=len)continue;
if(right-left-1>=max){
max=right-left-1;
start=left+1;
}
}
if(start+max==len)cnt=start;
else cnt=len-1;
}
printf("%d\n",cnt);
}
}
方法二:这个方法更简单
Judge(s+i,len-i) 一开始没想到这个方法
#include<stdio.h>
#include<string.h>
//判断是否是回文串
int Judge(char s[],int len){
int flag=1,i;
for(i=0;i<=len/2;i++){
if(s[i]!=s[len-i-1]){
flag=0;
break;
}
}
return flag;
}
int Add(char s[]){
int len=strlen(s);
int i;
for(i=0;i<len;i++){
if(Judge(s+i,len-i))return i;
}
return len-1;//最差情况
}
int main(){
int T;
scanf("%d",&T);
char s[1005]={};
while(T--){
scanf("%s",s);
printf("%d\n",Add(s));
}
}