【问题标题】:Longest common substring Algorithm O(n*m) brute force最长公共子串算法 O(n*m) 蛮力
【发布时间】:2012-10-15 05:24:23
【问题描述】:

我正在查看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] = in B[i + 2] 依此类推,直到不再有匹配或字符串结尾。如果是不匹配的情况,则从我们在 B 中检查的最后一个元素开始继续检查 B 中的 A[i]。我们对每个 A 元素重复此过程,同时存储到目前为止找到的最大子字符串的开始和结束索引.该算法似乎是 O(n*m)。如果我没有错的话,有什么理由不使用这种方法吗?

感谢您的帮助。

【问题讨论】:

    标签: algorithm substring


    【解决方案1】:

    如果我正确阅读了您的算法,那么我认为它是错误的。

    A = "abac"B = "ababac"。然后,使用i = 0,我们看到字符串匹配j = 0。所以我们开始匹配,并在j = 3 失败,因为b != c。所以我们从j = 3 开始匹配,但从b != a 开始就立即失败(注意我们不是从j = 2 开始,因为我们在那里成功匹配了a = a)。然后我们会得出结论,最长的子字符串是aba,这是不正确的。

    【讨论】:

    • 啊,好吧,你是对的。我想在那种情况下,我会让 A[i] 检查下一个 B 元素 B[j + 1] 而不是最后一个检查的元素。但是,如果 n = m,那么每个 A 元素将是 n^2 次迭代,给我 O(n^3)。维基就是这样。谢谢。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2017-06-13
    • 2021-01-08
    • 2020-05-30
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多