在
计算机科学中,最长公共子串问题是寻找两个或多个已知
字符串最长的子串。此问题与
最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。
利用广义后缀树,我们可以在的时间复杂度内求出和的最长公共子串的长度和他们的起始位置。而如果利用
动态规划求解,则时间复杂度为。而对于一般化的公共子串问题,使用动态规划的求解的时间复杂度为·...· ,利用广义后缀树则需的时间复杂度。
字符串集合的最长公共子串可以通过构造一棵广义后缀树, 然后去查找拥有来自所有集合中字符串的叶节点的最深的内部节点来得到。图1展示了字符串“ABAB”,“BABA”和“ABBA”对应的广义后缀树。为了方便后缀树的构造和区分字符串,每个串的结尾都添加了终结符“$”和字符串编号,分别变成了“ABAB$0”,“BABA$1”和 “ABBA$2”。如图1所示,串“A”,“B”,“AB”和“BA”的节点对应的子树都包含来自所有字符串的叶节点。
假定字母表的大小是常数,构造这样的一颗后缀树的时间复杂度为。这样,如果将整个树自顶向上遍历,并在每个节点通过一个位向量标记每个节点的子树中出现过的所有字符串的,则k-公共子串问题可以以的时间复杂度来解决。特别地,如果后缀树为常数时间的最近公共祖先检索做了优化,那么问题将可以在的时间复杂度内解决.