题目
解法1:
第一种解法是直接找到从这个字符串开始往后的最长回文子字符串,然后剩下的子字符串直接reverse之后加到前面就可以了
class Solution:
def shortestPalindrome(self, s: str) -> str:
n = len(s)
end = 0
for i in range(n+1):
if s[:i] == s[:i][::-1]:
end = i
if end == n:
return s
ans = s
for i in range(end,n):
ans = s[i] + ans
return ans
但这可能不是面试官最想看到的答案,这种解法是O(n*n)的。标准答案有可能是解法2,
解法2:kmp算法
详细的如何利用kmp算法的解释看这里。就确实比较难以理解,本身kmp算法就很难理解,如何应用在这也很难理解。kmp算法的详细解释看这里
class Solution:
def shortestPalindrome(self, s: str) -> str:
def create_LPS(w):
LPS = [0] * len(w)
tp = 0
bp = 1
while bp < len(w):
if w[tp] == w[bp]:
LPS[bp] = tp + 1
tp += 1
bp += 1
else:
if tp == 0:
LPS[bp] = 0
bp += 1
else:
tp = LPS[tp-1]
return LPS
rev_s = s[::-1]
palin_s = s + '#' + rev_s
LPS = create_LPS(palin_s)
return rev_s[:len(rev_s)-LPS[-1]] + s