例如:
源字符串是:“Mac和Jack是朋友” Pattern String是:“are”。
因此看起来总是匹配模式将从第0个索引开始。 并且在源字符串中将逐个字符地移动。
所以看起来它应该具有O(m n)的复杂性。 一般来说,我可以说KMP应该具有O(m n)的最坏情况复杂度,但我读到使用KMP我们可以在O(m + n)中解决子串匹配算法,所以很想知道最坏的情况案例分析。
答案 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
^