网上那些乱七八糟的文章看着冠冕堂皇,绕了一大圈,最后以前会的会了,以前不会的还是不会,故作姿态,可恶!
首先假设要在字符串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:
a | b | a | a | b | a | c | x | a | b |
在这个字符串中需找p段字符:
Q | a | b | a | a | b | a | c | x | a | b | |||||
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||||
p | a | b | a | c | x | a | b | ||||||||
next | -1 | -1 | 0 | -1 | -1 | 0 | 1 | ||||||||
j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ||||||||
匹配异常 | |||||||||||||||
此时i=3,j=3,next[j]=-1; | |||||||||||||||
这时应该让p[0],和Q[next[j]+1+i]进行比较,后面的比较依次进行,这时置j=0,i++ | |||||||||||||||
如果是这样的情况: | |||||||||||||||
Q | a | b | d | a | b | a | c | x | a | b | |||||
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||||
p | a | b | a | c | x | a | b | ||||||||
next | -1 | -1 | 0 | -1 | -1 | 0 | 1 | ||||||||
j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ||||||||
这时应该让让p[0],和Q[next[j]+1+i]进行比较,后面的比较依次进行,这时置j=0,i++ |