思路:等价于找s 的最长回文前缀,因为前缀是回文的话,只需要加上后面的不是回文的字符串放到前面就行
先将字符串进行反转,然后遍历看添加反转后的多少到前面能形成回文串
具体是从0开始截取到字符串长度减1的时候一定能截到
如果截取一个能形成回文串说明原字符串除了最后一个应该已经是回文串了
也就是反转后的应该等于反转前的
依次类推,从低向上递增,找最少答案
def shortestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if s == "":
return ""
sub = s[::-1]
for i in range(len(s)):
if sub[i:] == s[:len(s)-i]: #截取了sub[:i],所以如果能形成说明原字符串除了后面的[len(s)-i:]应该是回文才行
return sub[:i] + s #返回截取的加上原字符串的
找最长回文子序列
思路:
从后往前截取找最长回文子串
def shortestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if s == "":
return ""
for i in range(len(s),0,-1): #找最长回文子序列
if s[:i] == s[:i][::-1]: #如果是回文字串,那么反转后相等
return s[i:][::-1] + s #将不是回文的部分反转后加到序列前面
Rabin-Karp 字符串哈希算法
def shortestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
def endcode(sub):
return ord(sub)-ord("a")+1
base = 26
count = 0
mul = 1
mod = 10**5 + 7
pre,con = 0,0
for i in range(len(s)):
pre = (pre*base + endcode(s[i]))%mod #顺序的前缀hash值
con = (endcode(s[i])*mul + con)%mod #逆序的前缀hash值
mul = mul*base%mod
if pre == con: #相等代表是回文,遍历寻找最长的回文前缀
count = i+1
if count == len(s):
return s
else:
return s[count:][::-1] + s