实用算法实现-第8篇 后缀树和后缀数组 [1简介]

本文介绍了后缀树和后缀数组的概念及其在字符串处理中的应用,如查找子串、最长重复子串等。后缀树虽然高效,但构造复杂且空间开销大,而后缀数组可以通过Skew算法线性构造,且可通过扩展解决同样问题。后缀数组的height和LCP(最长公共前缀)在解决RMQ问题中的作用也被阐述。
摘要由CSDN通过智能技术生成

8.1    后缀树

一棵后缀树包含一个指定文本的所有后缀,对于在一个长度为N的文本中查找一个长度为M的子字符串,一个后缀树仅仅需要M次比较,而这个比较次数是查找该字符串所需要的最小比较次数。

后缀树有以下特征:一条边可以表示文本的任何非空子串,每个非终端节点,除了根节点,必须至少有两个孩子边,兄弟边表示的子串必须开始于不同的字符。

ababa所对应的后缀树如下所示:

后缀树可以解决很多复杂的字符串编程问题,包括:

1. 查询字符串S是否包含子串S1。主要思想是:如果S包含S1,那么S1必定是S的某个后缀的前缀;又因为S的后缀树包含了所有的后缀,所以只需对S的后缀树使用和Trie相同的查找方法查找S1即可。使用后缀树实现的复杂度同流行的KMP算法的复杂度相当。

2. 找出字符串S的最长重复子串S1。比如abcdabcefda里abc同da都重复出现,而最长重复子串是abc。

3. 找出字符串S1和S2的最长公共子串。注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者的字符的位置必须连续,后者则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值