牛客寒假算法基础集训营4 Applese 的回文串(思维)

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 }
 
原文地址:https://www.cnblogs.com/1013star/p/10369828.html