Suffix Tree

http://blog.youkuaiyun.com/g9yuayon/article/details/2574781

在文本T里查询T是否包含子串P(复杂度同流行的KMP相当)。
文本T里找出最长重复子串。比如abcdabcefda里abc同da都重复出现,而最长重复子串是abc。
找出字符串S1同S2的最长公共子串。注意不是常用作动态规划例子的LCS哈。比如字符串acdfg同akdfc的最长公共子串为df,而他们的LCS是adf。
Ziv-Lampel无损压缩算法。
还有就是这道面试题问的最长回文了。
Python实现紧凑前缀树(Compact Suffix Tree),也称为压缩后缀数组或后缀树的一种变种,通常用于高效地搜索文本模式或字符串相似度计算。这种数据结构相比于标准的后缀树节省空间,因为它只存储每个节点的实际后缀长度而不是完整后缀。 在Python中,可以使用内置的数据结构和一些高级库如`collections`、`heapq`等来构建。首先,你需要了解如何创建基本的后缀树,然后通过优化策略如只保存每个节点的结束字符位置和后缀长度来实现压缩。以下是一个简化的示例: ```python from collections import defaultdict class CompactSuffixTree: def __init__(self, text): self.text = text self.root = {} self.end_positions = defaultdict(list) for i in range(len(text)): self._add_suffix(i, text[i], i) def _add_suffix(self, start, char, end): node = self.root length = end - start + 1 for c in reversed(char): if c not in node: node[c] = {} node = node[c] node['#'] = (start, length) # '#'标记结束位置 if '#' not in node: node['#'] = None self.end_positions[length].append(start) def search(self, pattern): node = self.root length = len(pattern) for c in pattern: if c not in node: return None node = node[c] return node.get('#') # 使用示例 tree = CompactSuffixTree("abracadabra") print(tree.search("abra")) # 输出:(0, 4) ``` 在这个例子中,我们首先遍历输入文本,对于每个后缀,我们在树上从根开始构建,并记录每个节点的最后一个字符的位置和长度。查找模式时,我们可以直接沿着路径直到遇到结束位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值