KMP算法最易懂的说明

网上那些乱七八糟的文章看着冠冕堂皇,绕了一大圈,最后以前会的会了,以前不会的还是不会,故作姿态,可恶!

首先假设要在字符串Q中寻找字符串p,假设p为a b a c x a b a

那么关键是根据p来计算next[8]中的数值;

根据算法规定:

他的计算码是:

p: a     b    a    c    x    a    b

j: 0     1    2  3  4    5    6

next:-1     -1   0    -1  -1   0    1

解释next数值:

next[0] = -1;

next[1] = -1:因为p[1]!=p[0];

next[2]=0:因为p[2]==p[0];

next[3]=-1;前面next[2]=0,说明p[2]==p[0],这样我们需要去比较p[3]?=p[1]就好,如果相等,那么next[3] = next[2]+1,不等时要比较p[3]?=p[0],等于next[3]=0,否则next[3]=-1;

next[4]---next[5]同理

next[6]=1;因为next[5]=0,说明p[5]=p[0],这样需比较p[6]?=p[1],如果等于,next[6]=next[5]+1,不等时候,又要比较p[6]?=p[0],等于next[6]=0,不等next[6]=-1;

next数组编码就是这么的简单的来的,懂得了原理,敲几行代码应该很简单了,比TMD那些虚伪的文章简单多了吧!


至此,关键的next[]数组找出来了,下面编程:

我们设源串字符为:

Q:  

abaabacxab

在这个字符串中需找p段字符:

Qabaabacxab
i0123456789
pabacxab
next-1-10-1-101
j0123456
匹配异常
此时i=3,j=3,next[j]=-1;
这时应该让p[0],和Q[next[j]+1+i]进行比较,后面的比较依次进行,这时置j=0,i++
如果是这样的情况:
Qabdabacxab
i0123456789
pabacxab
next-1-10-1-101
j0123456
这时应该让让p[0],和Q[next[j]+1+i]进行比较,后面的比较依次进行,这时置j=0,i++


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值