题目链接:https://ac.nowcoder.com/acm/contest/330/I
题目描述
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。
如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
思路:其实判断插入一个字符后能不能构成回文和删除一个字符是一样的,因为插入一个新的字符就相当于删除与之对应的那个字符。如果本身就是回文串的话,插入一个新的字符有办法构成回文串(在中间插,如abccba->abcdcba,aba->abba)。如果本身不是回文串,先找到左右不同的那两个字符,分别去掉后再比较。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
char a[maxn];
int main(){
cin>>a;
int n=strlen(a),flag1=0,flag2=0,flag3=0;
for(int i=0;i<n/2;i++)
{
if(a[i]!=a[n-1-i]) flag1=1;//本身不是回文串
if(flag1)
{
if(a[i+1]!=a[n-1-i]) flag2=1;//去掉左边不同的字符后仍然不是回文
if(a[i]!=a[n-2-i]) flag3=1;//去掉右边不同的字符后仍然不是回文
}
}
if(flag2&&flag3) puts("No");
else puts("Yes");
}