多个串公共子串算法
来源:互联网 发布:自学编程网站有哪些 编辑:程序博客网 时间: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/
- 多个串公共子串算法
- 最长公共子串[算法]
- 最长公共子串LCS算法
- 最长公共子串LCS算法
- 求最大公共子串的算法
- [算法导论读书笔记]最长公共子串
- LCS算法求最长公共子串
- LCS算法求最长公共子串
- 最长连续公共子串算法
- 最长连续公共子串算法
- 最长公共子串(连续)算法
- LCS/最长公共子串算法分析
- 最长公共子串LCS算法
- 算法实现-->最长公共子串
- 最大公共子串(算法)
- 算法导论—最长公共子串
- 算法学习之最长公共子串
- 【算法题】最长公共子串
- LeetCode - Roman to Integer
- 摄像头驱动
- 单片机项目:驱动VS1003模块(二)
- JS dataTransfer 对象在拖拽中的使用
- 23 广播服务结合音乐Demo5
- 多个串公共子串算法
- loopback学习(5)--扩展API
- Host is not allowed to connect to this MySQL server错误的解决办法
- Linux系统的在线求助 man page 与 info page
- MySQL数据类型 BLOB和TEXT
- $.type()的用法
- hdu 1166 敌兵布阵 线段树
- day15 python css
- mongodb副本集和分片部署