KMP
题目:
要算nextval,先手算出next数组
手算出next数组
方法:从左往右的方向,第一个暴力写0,第二个暴力写1,后面的匹配失败在当前的位置前面划一条分界线,模式串一步步向后移动,直到分界线之前能"对的上",或者模式串完全跨过分界线为止,数分界线后的当前位置在模式串的第几个位置,那么next数组就写几
首先,暴力写0 1
- 一步步向后移
发现直到模式串完全跨过分界线还是没能匹配上
而这个位置为第一个元素,所以填1
- 第四个元素匹配失败
但同样在分界线前都不能匹配上
- 第五个元素匹配失败
这次在分界线之前后移能匹配得上
且模式串的下标为2
因此同理可得后面的next数组的值如下
nextval数组
nextval数组是在next数组上的优化
手算的话也很简单,直接看next数组来修改就好了
方法:从左往后扫next数组,看当前失配的元素的值是否和next数组当前位置所指向的位置的元素一样,如果不一样,那么当前元素next数组的值直接赋给nextval数组当前的位置,如果一样那么则说明这次的匹配也必定是失败的,那么与其让他多几个的匹配失败,还不如直接跳过该次匹配,则继续判断当前元素next数组所指向的位置的next数组所指向的位置的元素(套娃),当元素不一样的时候,把当前的位置下标赋给nextval数组,或者已经到达元素的0 /1的下标则停止,把其位置的next数组对应的值赋给nextval数组