KMP算法next数组中k = next[k]

KMP算法next数组中k = next[k]

next数组是KMP算法的关键,用于储存模式串指针j回溯的值,当模式串与主串失配时,利用next数组更快地找到模式串下一次开始比较的位置。

下面是next数组的代码:

void Getnext(int next[],String t)
{
   int j=0,k=-1;
   next[0]=-1;
   while(j<t.length-1)
   {
      if(k == -1 || t[j] == t[k])
      {
         j++;k++;
         next[j] = k;
      }
      else k = next[k];
   }
}

next数组主要是通过比较模式串最长公共前后缀来确定模式串指针移动的位置,这里我就不再赘述了,许多博主这个地方都讲的十分清楚。
我觉得上面这段代码最难理解的地方就是 k = next[k] ,这也是我一开始始终不能理解的地方,为什么要将k的值这样回溯?
在这里插入图片描述
当在模式串中发生失配时,我们不妨将前后缀分别看作主串和模式串,其实这里 k = next[k] 有点递归的意思,因为我们的Getnext函数是为了得到next数组,而在模式串的前后缀比较中(看作主串和模式串)发生失配的话,同样可以利用next数组来回溯k的值,因为前面{A B}已经配对过相等了,这里C和D不相等,也就是说当j指针指到最后的A时,它前面没有匹配的公共前后缀,即公共前后缀长度为0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值