我正在查看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)。如果我对此没有错,有没有理由不使用这种方法?
感谢您的帮助。
答案 0 :(得分:2)
如果我正确地阅读你的算法,那么我认为这是错误的。
允许A = "abac"
和B = "ababac"
。然后,使用i = 0
,我们会看到字符串在j = 0
处匹配。因此,我们开始匹配,并在j = 3
之后b != c
失败。我们开始在j = 3
进行匹配,但自b != a
后立即失败(请注意,由于我们已成功匹配j = 2
,因此我们不会从a = a
开始)。然后我们会得出结论,最长的子串是aba
,这是不正确的。