KMP算法详解

来源:互联网 发布:python中turtle画玫瑰 编辑:程序博客网 时间:2024/06/10 18:17

在数据结构中,KMP算法十一个比较难得内容,我个人经过长时间的努力,终于弄懂了,在这里我就把自己的经验分享给大家

KMP算法的思想就是:设s为目标串,t为模式串,并设i指针和j指针分别指向目标串和模式串中正待比较的字符,令i和j的初值均为0.若si=tj,则i和j分别加一;否则,i不变,j退回到j=next[j]的位置,再比较si和tj。以此此类推,直到遇到下列两种情况:一是j退回到某个j=next[j]时有si=tj,则指针各加一后继续匹配;另一种情况是j退回到j=-1,此时令指针各加一。

上面的适合用算法来实现,具体的算法后面再讲。如果是要快速的用KMP算法,以下方法可以选用。

第一步:求next的值

例如模式串 a   b   a  a   b   c   a   c  

next 值       -1   0   0   1   1   2   0   1

具体的求法如下:

1.模式串的前两个next一定为-1和0,要求第三个的next,就看前一个的next,在这里next[1]=0,找到0位的字符,是a,但是a不等与b,所以继续向前找,然后和b比较,再向前就是next[0]=-1,这已经是最前面了,所以第三位a的next为0

2.求第四位next,看第三为的next,next[2]=0,0对应的字符为a,与第四位的a相等,第四位的next为前一位的next加一,next[3]=1

3.求第五位,看第四位,next[3]=1,1对应的字符为b,b不等与a,再向前找,next[2]=0,0对应的字符为a,a等于第四位的字符,第五位的next 等于第三位的next加一

4.后面的以此类推

有的题目可能还会要求nextval的值,在这里顺便说一下nextval的求法

还是上面的模式串

还是一样前两个字符的next值为-1和0,求第三个就是看第三个的next值对应的字符是否和第三个字符相等,相等的话,第三个的nextval就是其next值对应的字符的next值,不相等的话,nextval的值就是第三个的next的值,后面的以此类推。上面的例子,a的next为0,0对应的字符为a,a等于a,第三位的nextval等于-1,第四位的next为1,1对应的b不等于a,第四位的nextval为其next的值

原创粉丝点击