最长回文子串,即正反读起来都一样,例如“ababa”。Manacher Algorithm算法利用了回文的重复特性,让时间复杂度降为了O(n)。
马拉车算法详解:
def longestPainromedon(s:str):
if len(s) < 1:
return s
new_str = '$' + '#'.join(s) + '^' #避免判断越界
center = 1 #最长回文子串中心位置
mx_right = 1 #最长回文子串最右面覆盖的位置
max_str = new_str[1] #最长回文子串
p = [0]*len(new_str) #回文子串半径表列
for i in range(1, len(new_str)-1):
j = 2*center - i
if i < mx_right:
if p[j] < mx_right - i:
p[i] = p[j]
else:
k = mx_right+1
while new_str[k] == new_str[2*i - k]:
k += 1
k -= 1
p[i] = k - i
cur_str = new_str[i - p[i]:i + p[i] + 1].replace('#', '')
if len(cur_str) > len(max_str):
max_str = cur_str
center, mx_right = i, k
else:
k = 0
while new_str[i - k - 1] == new_str[i + k + 1]:
k += 1
p[i] = k
cur_str = new_str[i - p[i]:i+p[i] + 1].replace('#', '')
if len(cur_str) > len(max_str):
max_str = cur_str
center, mx_right = i, k + i
return max_str
代码如上,此代码时完全照算法来的,其他的博客的代码我想应该是有所优化,导致我一开始有点懵。