引言:
书上关于next和nextval的修正值方法比较难理解,所以我这里讲解自己的方法。这里我就不介绍关于字符串匹配中KMP的优点,也不强调next的修正值比next的值好在哪,我们就说方法就行了。
一、next求解。
来,首先给我们一个序列
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
模式串 | a | b | a | a | b | c | a | c |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
首先我给出一个大的方法,然后按照这个方法一一展示求解的过程。
【方法】:
默认第一个和第二个字符的next值为0、1。那么从第三个开始依次执行如下操作:
找到当前要求next字符的前一个,以它为标准,找到其next对应下标的字符,和这个字符做比较。若相等,那么当前字符的next值就位此字符next加一;若不等,继续找现在字符next所指的下一个字符,还是和之前的字符比较,直到找到第一个位置为止,那么next为1。
好,我们来看看上面的操作步骤
- a,bnext值为0,1
- 要求next[3],那么我看3的前面的字符b,b的next值指的下标为第一位,第一位字符和b不相等,而且已经指到了最后一位,那么next[3]的值就1.
- 要求next[4],那么看前一个字符a,a的next所指的下标为第一位,第一位的字符和a相等,那么当前next[4]值就为next[3]+1=2
- 要求next[5],那么看前一个字符a,a的next所指的下标为第二位,第二位的字符和a不相等,那么我们看第二位next所指的字符是第一位,第一位的字符与a相等,所以next[5]=next[2]+1=2
- 依次类推即可。
二、求nextval(即next的修正值)
j | 1 | 2 | 3 | 4 | 5 |
模式串 | a | a | a | a | b |
next[j] | 0 | 1 | 2 | 3 | 4 |
nextval[j] | 0 | 0 | 0 | 0 | 4 |
【方法】:
在求出next的值的基础上,求nextval的方法其实很简单。默认第一个nextval的值是0,第二个字符如果和第一个字符相等,那么它的nextval的值就为0,不等就为1。之后遵循如下方法:
找到当前要求nectval值的字符,看它的next值下标所指向的字符是否和它相等,相等那么nextval为当前所指下标的nextval值,不想相等nextval的值就为本身字符的next值。
求上述的步骤:
- 第一个nextval值默认是0,第二个和第一个相等,所以也是nextval值也是0
- 第三个字符next所指的字符是2号位置的a,和它相等,那么nextva[3]的值就位nextval[2]得值,即为0
- 第四个字符next所指的字符是三号位置的a,和它相等,所以nextval的值就为3号位置的nextval值,即为0
- 第五个字符的next所指的字符是四号位置的a,和它不想打呢个,那么nextval的值就是它自己的next的值,即为4
- 依次类推即可
【总结】
当然,这些求next和next修正值的方法并不是唯一的,只是我自己在手写的时候觉得这个方法快捷简单。在程序中那又是另一回事了,这个可以看我的博客。如果有误,或者有问题,评论,谢谢。