本文介绍解决最长回文子串问题的 Manacher 算法(马拉车算法),该问题为 LeetCode 第 5 题。
5. Longest Palindromic Substring(最长回文子串)
问题描述
Manacher 算法
参考资料:LeetCode 5 官方题解
代码实现
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if len(s) <= 0:
return ''
# 在各字符之间插入 '#',以处理回文子串长度为偶数的情况
t = '$#'
for i in range(len(s)):
t += s[i] + '#'
t += '%'
list_radius = [0 for _ in range(len(t))] # 各位置的回文半径
right, centre = 0, 0 # 右边界和对应的回文中心
for i in range(1, len(t) - 1):
if right > i: # 跳过当前位置的对称点在当前左右边界内的回文部分
list_radius[i] = min(list_radius[2 * centre - i], right - i)
else:
list_radius[i] = 1
# 当前位置的回文探索
while t[i + list_radius[i]] == t[i - list_radius[i]]:
list_radius[i] += 1
# 更新左右边界
if right < i + list_radius[i]:
right = i + list_radius[i]
centre = i
r = max(list_radius)
c = list_radius.index(max(list_radius))
return ''.join(t[c - r + 1: c + r].split('#'))
运行效果