天天看点

线性结构---KMP模式匹配算法

【2014下半年】

在字符串的KMP模式匹配算法中,需先求解模式串的next函数值,其定义如下式所示,j表示模式串中字符的序号(从1开始)。若模式串p为“abaac”,则其next函数值为(60)。

线性结构---KMP模式匹配算法

A.01234  B.01122  C.01211  D.01111

【解析】

对于此类题目我看过一些官方给的标准答案,给人的感觉是一脸懵逼而且还不详细,为此我看了下KMP模式匹配算法的原理以及网上一些参考资料总结出做此类题目的小技巧如下:

求解next [ j ] 值的思路

j-1对应的串与next[ j-1]对应的串进行比较,若相等,则next[ j ]=next[j-1]+1;若不相等,则将j-1对应的串与next[ next [ j-1 ] ]对应的串进行比较,循环直到相等或与next[ 1 ]比较,若都不等,则为next函数中的其他情况。

可能你考到这里还是不懂什么意思接下来我们通过我的求解步骤来帮助大家理解。

首先我们看题目中所需要求的条件“abaac”,然后对照图示的规则获取有用的条件

线性结构---KMP模式匹配算法

因为abaac长度为5所以我们一位位长度讨论

①当j=1,next[1]=0

②当j=2,1<k<2,无法找到满足的k,所以属于其他情况next[2]=1

③当j=3,按照上述解题思路需要将第二位的模式串b(对应的next[2]=1)与它的next[2]的值(也就是第一位模式串a)作比较,因为b!=a,又因为第一位已经是最开始位置所以前面没有比较的模式串所以为其他情况next[3]=1

④当j=4,第三位的模式串a(对应的next[3]=1)与next[3]的值对应的模式串a作比较,因为a=a,所以next[4]=next[3]+1=2

⑤当j=5,第四位的模式串a(对应的next[4]=2)与next[4]的值对应的模式串也就是第二位模式串b作比较,因为b!=a,所以我们将第四位模式串与第一位模式串a作比较因为a=a,所以next[5]=next[4]+next[12+0=2