下标从0开始计算思路
计算next数组时 计算该下标对应的值 将包含该字符的字符串查找最长公共前后缀 把对应值填入数组对应下标内
匹配时 当检测到子串不匹配 取对应的前一个下标内取值 j=next[j-1]
(因为数组下标从0开始 检测到冲突时 需把指针移动到前面匹配过且为相等前缀的下标后一位 则下标内的长度恰好对应了指针需要移动到的位置 很巧妙)
变式1
由于每次需要取j=next[j-1]
取值 不方便 希望实现将值保存在本下标内 即代码j=[next]
因此可以将数组整体右移一位 -1
填充在左侧
变式2 想改造成"逻辑上是下标从1开始的"next数组
将变式1得到的数组整体加1(因此和下标从0开始这一性质恰好抵消了)
下标从1开始计算思路
计算next数组时 检查当前下标前面的子串 找到最长公共前缀的值 , 加1 填入该下标内(与前面变式1 变式2从而得到下标从1开始的数组本质上是一样的)
匹配时 当子串不匹配 j=[next]
(序号为1下标无脑填0 序号为2下标无脑填1)
总结
本质上是代码实现的思路不同 例书本上
就是采用数组下标从1开始逻辑去计算的
getNext(){
next[1]=0
while(i<T.length){
if(j==0||T.[]==S.[j]){
i++
j++
}
}
}
例子
若是不想纠结于此 任意一种方法求出next数组 观察选择题答案之间的联系 只存在右移/左移,加1/减1的操作 数组内的值仍然等比例
由于有多种表示方式 408应该不会出直接计算next/nextval值 可能以匹配过程中比较次数/滑动距离/指针值等方式变相考察