难度困难239收藏分享切换为英文关注反馈
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入:"aacecaaa"
输出:"aaacecaaa"
示例 2:
输入:"abcd"
输出:"dcbabcd"
简单来说,我们可以尽可能先找一个串s的回文前缀,然后在前边补上剩余序列的倒序,即可完成目标。用KMP算法高效的匹配s和它的reverse(s做模式串,s的reverse做目标串,为了好写),找到最大匹配的位置k,然后把k+1:-1的串取反放到s之前即可
class Solution:
def shortestPalindrome(self, s: str) -> str:
l = len(s)
nxt = [-1]*l
i,j = 0,-1
while i<l-1:
if j==-1 or s[i]==s[j]:
j+=1
i+=1
nxt[i]=j
else:
j = nxt[j]
k = -1
for i in range(l-1,-1,-1):
while k!=-1 and s[k+1]!=s[i]:
k = nxt[k]
if s[k+1] == s[i]:
k+=1
add = "" if k==l-1 else s[k+1:]
return add[::-1]+s