后缀树

后缀树(Suffix Tree),包含了一个或者多个字符串的所有后缀,空字符串也算是其中一个后缀。字符串 bananas,其所有后缀为bananas ananas nanas anas nas as s  $(表示空),我们可以把后缀树看作是所有后缀组成的一棵字典树,关于字典树请参考上一篇文章。

下面的图片引用自http://www.cppblog.com/yuyang7/archive/2009/03/29/78252.html,感谢作者
在图中就不再表示空下了

下图就是把所有的后缀组成一棵下字典树

 

 

 

 

下图是上图的压缩形式,就是把只有一个儿子的节点合并在后一起

后缀树的应用(来自一篇PPT,出处无从查找)
1. 查找一个字符串S是否包含了字符串T
如果S包含T,那么T必定是S的某个后缀的前缀,因为S的后缀包含了所有的后缀,因此只需要对S的后缀树使用和字典树相同的查找方法就行

2. 统计S中出现T的次数
每出现一次T,必定对应着一个不同的后缀,而这所有的后缀又都有着共同的前缀T。所以在这公共前缀下一共有多少个串,就是T的出现次数。

3. 找出S中最长的重复子串,出现了两次以上的串
找到含有两个儿子的最深的节点,根节点到这个节点的串就是最长的重复子串。
(网上有的说法实在看不懂,这是我自己想的,不对请指教)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值