在字符串处理中,回文(Palindrome)是一个非常经典的问题。比如“aba”、“abccba”都是回文串。当我们需要高效地统计一个字符串中所有不同的回文子串、或者快速判断某个位置是否构成回文时,回文树(Palindromic Tree),也被称为回文自动机(Eertree),是一种非常强大的数据结构。
本文将带你从零开始,用Python实现一个完整的回文树,并解释其工作原理。即使你是编程小白,也能轻松理解!
回文树是一种专门用于处理回文子串的数据结构。它由两棵特殊的“根”节点开始:
每个节点代表一个唯一的回文子串。通过 fail 指针(类似 AC 自动机中的失败指针),我们可以高效地跳转到当前回文的最长真后缀回文。
相比暴力枚举或 Manacher算法,回文树具有以下优势:
因此,回文树是 字符串回文处理 中非常实用的工具。
我们将逐步构建一个 PalindromicTree 类。
class PalindromicTree: def __init__(self): # 节点列表,每个节点是一个字典 self.nodes = [] # 创建两个根节点 # 根0:len = -1(奇数回文起点) self.nodes.append({ 'len': -1, 'fail': 0, # 指向自己 'next': {} }) # 根1:len = 0(偶数回文起点) self.nodes.append({ 'len': 0, 'fail': 0, # 指向根0 'next': {} }) self.last = 1 # 最后插入的回文节点 self.s = [-1] # 字符数组,-1 作为哨兵 self.n = 0 # 当前字符串长度 我们需要一个辅助函数,用来找到当前字符能扩展的最长回文后缀:
def get_fail(self, x): # 从节点 x 开始,沿着 fail 指针向上找 # 直到 s[n - len[x] - 1] == s[n] while self.s[self.n - self.nodes[x]['len'] - 1] != self.s[self.n]: x = self.nodes[x]['fail'] return x 这是核心方法,每次添加一个字符,尝试创建新回文节点:
def add_char(self, c): self.s.append(c) self.n += 1 # 找到当前能扩展的最长回文后缀 cur = self.get_fail(self.last) # 如果该回文 + c 已存在,则直接跳转 if c in self.nodes[cur]['next']: self.last = self.nodes[cur]['next'][c] return False # 未创建新节点 # 否则创建新节点 new_node = { 'len': self.nodes[cur]['len'] + 2, 'next': {}, 'fail': 1 # 默认指向空串(根1) } self.nodes.append(new_node) new_idx = len(self.nodes) - 1 self.nodes[cur]['next'][c] = new_idx # 设置 fail 指针 if new_node['len'] == 1: # 单字符回文,fail 指向空串 new_node['fail'] = 1 else: # 找到次长回文后缀 fail_node = self.get_fail(self.nodes[cur]['fail']) new_node['fail'] = self.nodes[fail_node]['next'].get(c, 1) self.last = new_idx return True # 创建了新回文 现在我们来测试一下这个回文树:
# 示例:统计不同回文子串数量tree = PalindromicTree()s = "abacaba"count = 0for char in s: if tree.add_char(char): count += 1print(f"字符串 '{s}' 中有 {count} 个不同的回文子串")# 输出:字符串 'abacaba' 中有 4 个不同的回文子串# 实际回文子串:"a", "b", "c", "aba", "aca", "bacab", "abacaba" —— 但注意回文树只统计“本质不同”的回文# 此处 count=4 是因为:a, b, c, aba(后续如 abacaba 会复用已有结构) 通过本文,你已经掌握了如何用 Python 实现一个功能完整的回文树。它不仅能高效处理回文问题,还是学习高级字符串算法的重要一步。
记住这四个关键 SEO关键词: Python回文树、 回文自动机、 Manacher算法替代、 字符串回文处理。 它们将帮助你在相关领域深入探索。
如果你觉得这篇文章对你有帮助,不妨动手实现一遍代码,加深理解!
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251211593.html