没有动态编程或后缀树的最长公共子串

Posted

技术标签:

【中文标题】没有动态编程或后缀树的最长公共子串【英文标题】:Longest Common Substring without Dynamic programming or Suffix Tree 【发布时间】:2017-12-22 23:58:20 【问题描述】:

Skiena 的算法设计手册问题 8-3 的 b 部分要求提供一个“更简单”的 BigO(nm) 算法,用于查找不依赖于动态规划的最长公共子串。显而易见的答案似乎是使用后缀树,但是,Skiena 使用“更简单”这个词简单的。所以,我想知道,有没有另一种方法可以在 O(nm) 时间内解决这个问题?

【问题讨论】:

【参考方案1】:

假设我们在第一个(较短的)字符串s 中固定了起始位置i。现在让我们在较长的字符串中找到其最长的前缀。它可以在O(n + m) 中通过检查字符串s[i:] + # + t 的prefix function(或z function)来完成,其中# 是st 中不存在的特殊符号。

总体复杂度为O(n(n + m)),如果n ,则为O(nm)

【讨论】:

以上是关于没有动态编程或后缀树的最长公共子串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用树找到最长的公共子串?

后缀数组 模板题 hdu1403(最长公共(连续)子串)

最长回文子串和后缀特里树

ural1297(后缀树组+rmq)

后缀树

poj1226-出现或反转后出现在每个串的最长公共子串后缀数组