KMP next数组下标从0/1开始对应关系

下标从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值 可能以匹配过程中比较次数/滑动距离/指针值等方式变相考察

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值