最长公共子串算法O(n * m)强力

时间:2012-10-15 05:24:24

标签: algorithm substring

我正在查看http://en.wikipedia.org/wiki/Longest_common_substring_problem

上的算法

他们使用动态编程,给他们一个O(nm)的时间。但是,使用强力算法不能同时实现复杂性吗?我正在做一个功课问题,在O(n * m)时间内找到这个算法,其中n和m是字符串长度。

对于字符串A和字符串B,我检查A [i]是否等于B中的任何元素。如果它等于某个B [j],则检查A [i + 1]是否等于B [j + 1 ],如果A [i + 2] =在B [i + 2]中等等,直到不再匹配或结束字符串。如果它是不匹配的情况,那么从我们在B中检查的最后一个元素开始继续检查B中的A [i]。我们为每个A元素重复此过程,同时存储到目前为止找到的max子串的开始和结束索引。该算法似乎是O(n * m)。如果我对此没有错,有没有理由不使用这种方法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果我正确地阅读你的算法,那么我认为这是错误的。

允许A = "abac"B = "ababac"。然后,使用i = 0,我们会看到字符串在j = 0处匹配。因此,我们开始匹配,并在j = 3之后b != c失败。我们开始在j = 3进行匹配,但自b != a后立即失败(请注意,由于我们已成功匹配j = 2,因此我们不会从a = a开始)。然后我们会得出结论,最长的子串是aba,这是不正确的。