Applese 的回文串
链接:https://ac.nowcoder.com/acm/contest/330/I
题目描述
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。
如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
输入描述:
仅一行,为一个由字母和数字组成的字符串 s。
输出描述:
如果在插入一个字符之后可以构成回文串,则输出"Yes", 否则输出"No"。
示例1
输入
applese输出
No
示例2
输入
java
输出
Yes
备注:
|s|≤10^5
题解:
在任意位置插入一个字符可以构成回文串等价于在任意位置删除一个字符可以构成字符串。有一个巨坑 abc.......bca究竟用左边的b匹配右边的b还是用右边的c匹配左边的c更优呢
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1e5+10;
7 char s[maxn];
8 int main()
9 {
10 scanf("%s",s);
11 int flag=0;
12 int cnt=0;
13 int len=strlen(s);
14 for(int i=0,j=len-1;i<j;i++,j--)
15 {
16 if(cnt>=2)
17 break;
18 if(s[i]!=s[j])
19 {
20 cnt++;
21 if(s[i+1]==s[j]&&s[i]!=s[j-1])
22 i++;
23 else if(s[i]==s[j-1]&&s[i+1]!=s[j])
24 j--;
25 else if(s[i]==s[j-1]&&s[i+1]==s[j])
26 {
27 int flag1=0,flag2=0;
28 for(int l=i,r=j-1;l<r;l++,r--)
29 {
30 if(s[l]!=s[r])
31 {
32 flag1=1;
33 break;
34 }
35 }
36 for(int l=i+1,r=j;l<r;l++,r--)
37 {
38 if(s[l]!=s[r])
39 {
40 flag2=1;
41 break;
42 }
43 }
44 if(flag1==0||flag2==0)
45 {
46 puts("Yes");
47 return 0;
48 }
49 else
50 {
51 puts("No");
52 return 0;
53 }
54
55 }
56 else
57 {
58 cnt++;
59 }
60 }
61 }
62 if(cnt<2)
63 puts("Yes");
64 else
65 puts("No");
66 }