Skiena的算法设计手册问题8-3 b部分要求给出一个更简单的" BigO(nm)算法,用于查找不依赖于动态编程的最长公共子串。显而易见的答案似乎是使用后缀树,但是,Skiena使用了单词" Simpler"我不确定后缀树比DP更简单,也许搜索更简单,但是以nm时间复杂度构建后缀树并不简单。所以,我想知道,是否有另一种方法可以在O(nm)时间内解决这个问题?
答案 0 :(得分:1)
我们说我们在第一个(较短的)字符串i
中修复了起始位置s
。现在让我们在较长的字符串中找到最长的前缀。可以通过检查字符串O(n + m)
的{{3}}(或prefix function)在s[i:] + # + t
中完成,其中#是{{1}中不存在的特殊符号}和s
。
总体复杂度为t
,如果n <1,则为O(n(n + m))
。米