后缀树

后缀树(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中最长的重复子串,出现了两次以上的串
找到含有两个儿子的最深的节点,根节点到这个节点的串就是最长的重复子串。
(网上有的说法实在看不懂,这是我自己想的,不对请指教)

 

你可能感兴趣的:(后缀树)