关于字符串的模式匹配KMP算法
字符串的简单模式匹配算法,效率不够高,因为有很多的比较是没有必要的,所以对比较的次说,通过优化可以减少,从而达到提高效率的目的。
KMP算法由Knuth,Morris,Pratt三人同时发现,所以叫做KMP算法。
假设我们有一串字符S :a b c a b c a a b c a b c a b b a c
我们模式字符串是P:a b c a b c a b b a c
简单匹配算法是逐个检验,每次P串往前进1个,来和S串比较,但是有很多情况下,有很多比较是多余的,比如S[1]=P[1],而P[0] ≠P[1]所以P[0]没有必要和S[1]比较。
最好的情况是不重复比较,但是这样又不能保证在前半段匹配成功的部分字符串中,没有能和模式串匹配的。
a b c a b c a a b c a bc a b b a c
ab c a b c a b b a c
例如,在前7个字符中标绿的子字符串还能匹配,如果跳过的话,肯定会造成结果的不准确。
所以KMP算法就是来寻找像标绿这样的子字符串的方法
现在我们需要从S中搜索,看有没有字串P
首先我们来定义前缀字串和后缀字串(其实就是上述标绿的字符串)
设j为比较串的当前比较位置
设i为模式串的当前位置
a b c a b c a ab c a b c a b b a c j=7
a b c a b c a bb a c i=7
我们从头开始比较,发现从标红的地方,开始不一样了,在标红之前是一样的即
a b c a b c a
设前缀和后缀字串的长度为k
k为1时,即 a——a
2时a b—— c a
3时a b c——b c a
4时a b c a——a b c a
5时a b c a b——c a b c a
6时a b c a b c——b c a b c a
注意,当比较到6的时候就结束比较,比较到k=j-1的时候停止,我们发现当k=1或4的时候,前缀和后缀相同,我们取最大值k=4,即调整j=4
a b c a b c a ab c a b c a b b a c
a b c a b c ab b a c
这样比较就减少了比较次数,提高了算法的效率