没有动态规划或后缀树的最长公共子串

Longest Common Substring without Dynamic programming or Suffix Tree

Skiena's Algorithm Design Manual 第8-3题b部分要求给出一个"simpler" BigO(nm)算法,用于寻找不依赖于动态规划的最长公共子串。显而易见的答案似乎是使用后缀树,但是,Skiena 使用 "Simpler" 这个词我不确定后缀树是否比 DP 更简单,也许搜索更简单,但是在 nm 时间复杂度中构建后缀树是绝非简单。所以,我想知道,是否有另一种方法可以在 O(nm) 时间内解决这个问题?

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

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

,则为 O(nm)