查看“︁最长公共子串”︁的源代码
←
最长公共子串
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{NoteTA |G1 = IT }} {{Distinguish|最长公共子序列}} 在计算机科学中,'''最长公共子串问题'''是寻找两个或多个已知[[字符串]]最长的子串。此问题与[[最长公共子序列]]问题的区别在于子序列不必是连续的,而子串却必须是。 == 样例 == 字符串"ABABC","BABCA"以及"ABCBA"的最长公共子串是"ABC"。其他的公共子串包括"A"、"AB"、"B"、"BA"、"BC"以及"C"。 ABABC ||| BABCA ||| ABCBA ==问题定义== 给定两个字符串,长度为<math>m</math>的字符串<math>S</math>以及长度为<math>n</math>的字符串<math>T</math>,求最长的子串<math>x</math>同时是<math>S</math>以及<math>T</math>的连续子串。 问题可以一般化为'''k-公共子串问题'''——给定字符串的集合<math>{\displaystyle S=\{S_{1},...,S_{K}\}}</math>,其中<math>|S_i|=n_i</math> , <math>\Sigma n_i = N</math>.。对于满足 <math>2 \leq k \leq K</math>的<math>k</math>,找出至少是<math>S</math>中<math>k</math>个字符串的公共子串的最长串。 == 求解算法 == 利用[[广义后缀树]],我们可以在<math>\Theta(n+m)</math>的时间复杂度内求出<math>S</math>和<math>T</math>的最长公共子串的长度和他们的起始位置。而如果利用[[动态规划]]求解,则时间复杂度为<math>\Theta(nm)</math>。而对于一般化的公共子串问题,使用动态规划的求解的时间复杂度为 <math>\Theta(n_1</math>·...·<math>n_K)</math> ,利用广义后缀树则需<math>\Theta(N * K)</math>的时间复杂度。 ===利用广义后缀树=== [[Image:Suffix tree ABAB BABA ABBA.svg|thumb|400px|right|[[Generalized suffix tree]] for the strings "ABAB", "BABA" and "ABBA", numbered 0, 1 and 2.]] 字符串集合的最长公共子串可以通过构造一棵[[广义后缀树]], 然后去查找拥有来自所有集合中字符串的叶节点的最深的内部节点来得到。右图展示了字符串“ABAB”,“BABA”和“ABBA”对应的广义后缀树。为了方便后缀树的构造和区分字符串,每个串的结尾都添加了终结符“$”和字符串编号,分别变成了“ABAB$0”,“BABA$1”和 “ABBA$2”。如图所示,串“A”,“B”,“AB”和“BA”的节点对应的子树都包含来自所有字符串的叶节点。 假定字母表的大小是常数,构造这样的一颗后缀树的时间复杂度为<math>\Theta(N)</math>。这样,如果将整个树自底向上遍历,并在每个节点通过一个位向量标记每个节点的子树中出现过的所有字符串的,则k-公共子串问题可以以<math>\Theta(NK)</math> 的时间复杂度来解决。特别地,如果后缀树为常数时间的最近公共祖先检索做了优化,那么问题将可以在<math>\Theta(N)</math> 的时间复杂度内解决.<ref name="Gus97">{{cite book | last = Gusfield | first = Dan | origyear = 1997 | year = 1999 | title = Algorithms on Strings, Trees and Sequences: Computer Science and Computational Biology | publisher = Cambridge University Press | location = USA | isbn = 0-521-58519-8}}</ref> == 参考资料 == [[Category:算法]] [[Category:动态规划]] [[Category:组合数学]]
该页面使用的模板:
Template:Cite book
(
查看源代码
)
Template:Distinguish
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
返回
最长公共子串
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息