python之回文子串

1.贴题

题目来自PythonTip
回文子串


给你一个字符串a和一个正整数n,判断a中是否存在长度为n的回文子串。如果存在,则输出YES,否则输出NO。
回文串的定义:记串str逆序之后的字符串是str1,若str=str1,则称str是回文串,如”abcba”.


2.说明

一开始将长度为n的字符串在a的逆序字符串里找,找到yes,找不到no,代码如下

b = a[::-1]
for x in range(len(a)-n):
    if a[x:x+n] in b:
        print("YES")
        break
else:
    print("NO")

提交后说不对,检查了一下代码发现意思理解有偏差。不是存在逆序就可以了,位置不能变动,更改代码如下

for x in range(len(a)-n):
    b = a[x:x+n]
    c = b[::-1]
    if b == c:
        print("YES")
        break
else:
    print("NO")

提交后发现还是不对,但是测了几个数据都没有发现问题,最后测到a = "abcba"; n = 5发现问题了,因为len(a)-n为0所以进不去循环,而a字符串整个是回文的,于是增加了特殊讨论。

3.参考代码

if len(a)-n == 0: #特殊情况讨论,如果n等于字符串长度
    if a == a[::-1]: #判断a整个是否为回文
        print("YES")
    else:
        print("NO")
else: #如果n不等于字符串长度
    for x in range(len(a)-n): #依次取长度为n的字符串
        b = a[x:x+n] #取出为b
        c = b[::-1] #将其逆序为c
        if b == c: #比较b和c是否相等
            print("YES") #如果相等说明是回文,打印yes
            break #退出循环
    else: #如果遍历完字符串还没有找到回文
        print("NO") #打印no

4.其他写法

看了别人的写法才发现是range的范围写错了,正确的应该还要加一,一行代码来自 ChristinaT

print('YES' if [a[i:i+n] for i in range(0,len(a)-n+1) if a[i:i+n] == a[i:i+n][::-1]] else 'NO')
阅读更多

扫码向博主提问

risuinazoo

专注于把简单问题吃透!
  • 擅长领域:
  • python基础
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41980474/article/details/80342684
个人分类: python3
所属专栏: python基础题详解
上一篇python之信息加密
下一篇python之时间就是金钱
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭