Applese 的回文串(加一个字符的回文)

链接: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo Bliss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值