链接:https://ac.nowcoder.com/acm/contest/330/I
来源:牛客网
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。
如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
/*
常规思路:
一个字符串如果原先是回文,可以在中间加一个,一定是回文
如果之前不是回文,那么依次去掉一个,得到的子串中有一个是回文的话,那么原串加一个也可以是回文
但是常规思路时间复杂度为O(n^2)
常规思路对于本题字符串比较长,时间会超
比较特别的思路:
取出不匹配位置之间的字符串(包括不匹配位置这两个字符),分别去掉一个头和一个尾得到字符串判断是不是回文,只要有一个是回文,那么原串就可以加一个使它成为回文,时间复杂度为O(n)
所以对于本题就要用第二种思路去做
*/
AC_code:
#include <stdio.h>
#include <string.h>
const int N = 1e5 + 5;
char a[N],b[N];
bool H(char b[],int s,int e)
{
for(int i = s,j = e; i <=( e- s + 1) / 2; i++,j--)
{
if(b[i] != b[j])
return false;
}
return true;
}
int main()
{
while(~scanf("%s",a))
{
int length_a = strlen(a),flag = 1;
for(int i = 0,j = length_a-1; i <= length_a / 2; i++,j--)
{
if(a[i] != a[j])
{
flag = 0;
strncat(b,a+i,j-i+1);
break;
}
}
if(!flag)
{
int lenth_b = strlen(b);
if(H(b,1,lenth_b-1)||H(b,0,lenth_b-2))
flag = 1;
}
if(flag)
puts("Yes");
else
puts("No");
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
}
return 0;
}