如果模式字符串中的所有字符都是唯一/不同的,那么KMP如何取O(m + n)

时间:2017-07-04 07:13:20

标签: algorithm data-structures

例如:

源字符串是:“Mac和Jack是朋友” Pattern String是:“are”。

因此看起来总是匹配模式将从第0个索引开始。 并且在源字符串中将逐个字符地移动。

所以看起来它应该具有O(m n)的复杂性。 一般来说,我可以说KMP应该具有O(m n)的最坏情况复杂度,但我读到使用KMP我们可以在O(m + n)中解决子串匹配算法,所以很想知道最坏的情况案例分析。

1 个答案:

答案 0 :(得分:0)

我也在考虑很多。这就是我的结论。 (假设n是要搜索的字符串的长度,m是模式的长度)

在幼稚的字符串匹配暴力解决方案中,您需要遍历给定n的所有m的唯一原因是是否存在重复

例如:

string: abcdabcdabcd
pattern:abcde

迭代1:

string: abcdabcdabcd
        ^
pattern:abcde
        ^

迭代m

string: abcdabcdabcd
            ^
pattern:abcde
            ^

不匹配!因此在迭代m+1上,我们这样做:

string: abcdabcdabcd
         ^
pattern:abcde
        ^

现在在KMP的情况下,在迭代m+1上,我们不需要将字符串指针重置得很远,因为因为如果字符串(基于1的索引)上位置2的字符确实匹配模式,那么该模式将连续出现重复的字符。

KMP iteration m + 1, pattern has all distinct characters

string: abcdabcdabcd
            ^
pattern:abcde
        ^

如果存在重复,则在迭代m+1上,我们不会将模式上的指针重置为远:

KMP iteration m + 1, pattern has runs of characters

string: aaaac
            ^
pattern:aaaab
           ^