这道题求的实际上是字符串s从头部开始的最长回文子字符串,然后将剩余部分reverse一下拼接在头部即可。
首先需要了解一下KMP算法(https://www.cnblogs.com/zhangtianq/p/5839909.html)
然后只需要构造ss = s + '#' + reverse(s),对ss求KMP得next table(这里注意next table长度需要为len(ss) + 1),next table中最后一位得元素表示了ss字符串头部与尾部的最长匹配,即位字符串s从头部开始的最长回文子字符串长度。
class Solution(object):
def shortestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if len(s) <= 1:
return s
ss = s + "#" + s[::-1]
next = [-1] * (len(ss)+1)
k = -1
j = 0
while j < len(ss):
if k == -1 or ss[j] == ss[k]:
k += 1
j += 1
next[j] = k
else:
k = next[k]
return s[next[-1]:][::-1] + s