笔试题- 回文串

回文串问题

问题描述

输入一个字符串,若他是回文串,直接输出。

若不是回文串,让他补充成一个最短的回文串后输出。

样例1

11211

输出1

11211

样例2

abcb

输出2

abcba

思路

以样例2为例:

​ abcb,从后往前扫描,找到bcb是当前最长的回文串。

​ 返回0,指的是索引0后面的位置都是回文串,补上前面的部分,即a(bcb)a。

​ 输出abcba

再比如:

​ 1233,从后往前扫描,找到33是当前最长的回文串。

​ 返回1,[0,1]是需要逆序补充的字符串,即12(33)21

​ 输出123321

解题步骤

​ 若已经是回文串,则直接输出。若不是:

​ step1:从后往前找,找到从后往前的最长回文串的索引位置

​ step2:将前面的字符串逆序输出。

PS:如果题目改成了对称字符串,即输入abcb,输出abcbbcba,则在判断回文的时候加上len(s)%2==0 的判断条件即可。

代码

def isRe(s):
    return len(s)%2==0 and s == s[::-1]

def getLargeRe(s):
    '''从后往前找最长回文串, 返回一个索引值。如1233返回1,123返回1,指的是索引之后的串是回文串'''
    s_len = len(s)
    index = s_len - 1
    max_index = s_len - 1
    while index >= 0:
        if isRe(s[index:]):
            max_index = index-1
        index -= 1
    return max_index

if __name__ == '__main__':
    while True:	#这里用来测试
        s = input()
        if isRe(s): print(s)
        else:
            max_index = getLargeRe(s)
            # print(max_index)
            s = s + s[0:max_index+1][::-1]
            print(s)

分析

这里用了python的字符串切片,实际上时间复杂度应该还是O(N²),空间复杂度O(N)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值