多个串公共子串算法

来源:互联网 发布:自学编程网站有哪些 编辑:程序博客网 时间:2024/06/05 06:22

求多个字符串的最长公共子串

最长公共子串(Longest common substring, 简称LCS)问题指的是求出给定的一组
字符串的长度最大的共有的子字符串。
举例说明,以下三个字符串的LCS就是 cde:
abcde
cdef
ccde
高效的查找LCS算法可以用于比较多篇文章的最长相同片段,以及生物学上的基因比
较等实际应用。
前几天写了一个穷举法的简单实现,感觉在数据量稍大时效率极低,所以今天上网查
了一些资料,找到了解决LCS问题的最佳算法并编程实现,程序效率得到了极大的提
高。
采用的是广义后缀树(Generalized Suffix Tree,简称GST)算法,就是把给定的N个
源字符串的所有的后缀建成一颗树,这个树有以下一些特点:

1.树的每个节点是一个字符串,树根是空字符串“”
2.任意一个后缀子串都可以由一条从根开始的路径表达
(将这条路径上的节点字符串依次拼接起来就可以得到这个后缀)
3.特别应注意任意一个子串都可以看作某一个后缀的前缀。既然每一个后缀
都可以由一条从根开始的路径表达,那么我们可以从根节点开始一个字符
一个字符的跟踪这条路径从而得到任意一个子串。
4.为了满足查找公共子串的需求,每个节点还应该有从属于哪个源字符串的
信息

由以上的定义我们不难看出,在这棵GST树上,如果找到深度最大并且从属于所有源
字串的节点,那么,把从根到这个节点的路径上的所有节点字符串拼接起来就是
LCS。
还是举例说明,上面提到的三个字符串【abcde cdef ccde】的所有后缀子串列表如
下:
(注:.1表示是从第一个串abcde来的,同理.2,.3分别表示从cdef,ccde来的)
abcde.1
bcde.1
cde.1
de.1
e.1
cdef.2
def.2
ef.2
f.2
ccde.3
cde.3
de.3
e.3
建成的GST如下图所示
(注:.1表示从属于第一个串,.123表示既从属于第一又从属于第二,第三个源串)

--\_______【abcde.1】              |                              |_____【bcde.1】         .....最深的并且带.123的节点     |                        :     |_____【c.123】____【de.123】_______【f.2】     |               |     |               |__【cde.3】     |     |_____【de.123】___【f.2】     |     |_____【e.123】____【f.2】     |     |_____【f.2】 

上图中虚线所指的【de.123】节点所表示的子串cde正是LCS
以上是一些基本概念,但是实际应用时还要涉及到构建GST树以及查找LCS的具体算
法,参考了网上的一些资料,我用java语言实现了这些算法,基本上可以以O(n)的时间
复杂度进行建树及查找处理。
如果对构建SuffixTree算法等细节感兴趣,可以到google上查阅相关资料。

FROM:

http://tianyunpu2008.blog.163.com/blog/static/6559379920089162236915/

0 0
原创粉丝点击