回文串问题

问题描述

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

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

样例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)