next数组的用法
首先,当我们进行KMP匹配的时候,我们会用主串和模式串进行对比。当失配的时候我们需要把 指向模式串的指针指向next[j]。
原因是因为在主串指针前的所有内容是可以用共同的前后缀来进行匹配的,next数组也是用共同的前后缀来得出的
next数组的求法
将指向模式串的指针Pj,前面的部分比如目前指向了j=5的位置。我们可以看到1234中最大的前后缀匹配就是{ab}也就是说,我们直接指向前缀ab之后的元素即可,也就是令模式串的指针的j=3
由此我们得到的next数组就可以用于KMP算法模式串指针的移动
nextval的求法
但是如果我们按照next数组可能会出现,指针在5失配,指针又转向3同时又失配,不得不转向1结果又失配,因为他们失配的原因是跳转到的字母和目前失配的字母一样,所以会连续失配
因此我们只需要从头到后检查,自己要跳转的字母是否和自己一致,若和自己一致,则追根溯源到最开始这个字母的失配next[j]