前面的文章中有讲解了模式匹配相关的KMP和TrieTree,他们有各自的方式去提高性能,从而也应用在不同的场景中,这一次我们讲解后缀树(SuffixTree),相信如果没有专门去看过这些知识的同学应该很少知道后缀树,那么后缀树到底是什么,他能解决什么样的问题呢?
后缀树(SuffixTree)一种数据结构,通过对一个字符串所有后缀操作构建一棵树,可以支持字符串的快速匹配查询,他对于以下几个字符串问题可以做到快速实现。
1> 查找字符串A是否在字符串B中,也就是常规的字符串查找问题。
2> 计算给定的字符串A在字符串B中重复出现的次数。也就是子串重复的次数。
3> 查找字符串A的最长重复子串。
4> 查找字符串A和字符串B的最长公共子串。不是LCS问题哦!
5> 查找字符串A的最长回文子串。
6> 其实SuffixTree最常用的地方是生物学的碱基配对问题.
那看了上述问题,我们来讲解后缀树的结构,后缀树顾名思义是要用到字符串的后缀,先来说明下什么是后缀,比如有一个字符串dream,那么他的后缀有很多个,分别是dream它本身,ream,eam,am,m,还有一个空字符串当然也是他的后缀。他的后缀集合为:dream=suffix{dream, ream, eam, am,m,空串}。我们构建一个后缀树就要利用到这些后缀来构建一压缩的trie树,也就是Compacted Trie(将trie上单个子节点的路径进行压缩即可得到)。
先看一个CompactedTrie的构建。假设我们的有字符串abc, abd, def我们首先用这些字符串构建一个Trie如下所示: