在字符串处理领域,Manacher算法是一种非常高效的算法,用于在线性时间复杂度 O(n) 内找出一个字符串中的最长回文子串。对于初学者来说,这个算法可能看起来有点复杂,但通过本文的详细讲解,即使是编程小白也能轻松掌握!
回文是指正着读和反着读都一样的字符串,例如:"aba"、"abba"、"racecar" 等。在很多编程面试题和实际应用中,我们经常需要找出一个字符串中最长的回文子串。
暴力方法需要 O(n³) 的时间复杂度,中心扩展法是 O(n²),而 Manacher算法可以将时间复杂度优化到 O(n),空间复杂度为 O(n)。这使得它在处理大型文本时具有显著优势,是字符串处理中的经典算法之一。

Manacher算法的关键在于利用回文的对称性来避免重复计算。它通过维护一个“回文半径数组”(通常记为 P),以及两个指针:center(当前已知最右回文的中心)和 right(当前已知最右回文的右边界)。
为了统一处理奇数长度和偶数长度的回文,算法首先对原字符串进行预处理:在每个字符之间插入特殊符号(如 #),并在首尾加上不同的边界符(如 ^ 和 $)。
def preprocess(s): if not s: return "^$" result = "^" for char in s: result += "#" + char result += "#$" return result例如,输入 "aba" 会被转换为 "^#a#b#a#$"。这样所有回文都变成奇数长度,便于统一处理。
def manacher(s): # 预处理字符串 T = preprocess(s) n = len(T) P = [0] * n # 回文半径数组 center = right = 0 # 当前中心和右边界 for i in range(1, n - 1): # 利用对称性获取初始半径 mirror = 2 * center - i if i < right: P[i] = min(right - i, P[mirror]) # 尝试扩展回文 try: while T[i + (1 + P[i])] == T[i - (1 + P[i])]: P[i] += 1 except IndexError: pass # 更新中心和右边界 if i + P[i] > right: center, right = i, i + P[i] # 找出最大回文半径及其位置 max_len = max(P) center_index = P.index(max_len) # 计算原始字符串中的起始位置 start = (center_index - max_len) // 2 return s[start:start + max_len]if __name__ == "__main__": test_str = "abcbad" result = manacher(test_str) print(f"输入字符串: {test_str}") print(f"最长回文子串: {result}") # 输出: 最长回文子串: abcba通过本文,你已经掌握了如何用 Python实现Manacher算法来高效查找最长回文子串。该算法充分利用了回文的对称性质,是字符串处理中的利器。无论你是准备面试还是解决实际问题,理解并掌握这一算法都将大有裨益。
记住,关键点在于:预处理字符串、维护回文半径数组、利用对称性减少重复计算。多加练习,你也能轻松驾驭这个优雅的算法!
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126774.html