浅显易懂KMP

模式匹配的一种改进算法,是由D.E,Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。此算法可以在O(n+m)的时间的数量级上完成串的模式匹配操作。改进在于:每当一趟模式匹配过程中出现的字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向向右“滑动”尽可能远的一段距离后,继续进行比较。(摘自严蔚敏版《数据结构》)(看完整篇你会懂01112231123456712)

next[j]函数,表明当前模式中第j个字符与主串中响应字符“失配”时,在模式中需重新和主串中欧冠该字符进行比较的字符位置。

next[j]=\left\{\begin{matrix} max\left \{ k|1<k<j,||"p_{1}....p_{k-1}"="p_{j-k+1}...p_{j-1}" \right \} & \\ 0&j=1& \\ 1 & other \end{matrix}\right. 

举个栗子解释一下KMP的过程:

分析:看前面公式当j=1时,next[j]=0;

j=2时,j前面只有一个字符,没有前缀也没有后缀这个就是那个其他情况,next[j]=1。(讲道理,一般前面两个,第一个都是 0,第二个都是 1)

j

1234567

模式串

abcaabb

next[j] 

01     

分析:j=3,我们分别来找前缀和后缀,之前的字符‘a’与‘b’不相等,及 既不是等于0的情况没有找到相同的就是其他情况。

j

1234567

模式串

abcaabb

next[j] 

011    

分析:j=4,看这个字符的前面有没有一样的,没有,还是1

j

1234567

模式串

abcaabb

next[j] 

0111   

 


分析:j=5,看这个字符的前面有一样的,这样得到k-1=1;k=2;

j

1234567

模式串

abcaabb

next[j] 

01112  

j=6

j

1234567

模式串

abcaabb

next[j] 

011122 

j=7

j

1234567

模式串

abcaabb

next[j] 

0111223

图摆在这感觉就差不多了,emmmm出道题  模式串为:abcaabbcaabcaabdab    next[j]序列是多少?

答案见第一段那一串数

看完还不懂私信我能看到就给你一对一讲(叉腰)还有nextval值回头补QAQ(嘟嘟囔囔:感觉应该也没人能看到我这篇)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值