对于KMP算法中的next数组的理解

引言

刚开始学KMP算法时一直弄不懂next数组,觉得有点复杂,现在差不多有些理解了。所以现在来记录一下~
如果有什么想法,可以互相交流一下。

理解

通过分析模式串 t 从中提取出加速匹配的有用信息,而这些有用信息通常采用 next 数组来表示。

对于第j个字符的next数组值的记载,即从模式串最左边开始往右数k个字符与从模式串第j个字符(即记录的这个字符)的左边开始往左数k个字符,(两字符串相比时按照从左到右的顺序)如果这k个字符相等则将该k值存储到next数组里,不断存入,直到两个字符串出现不同,并将k的值化为-1。(k的初始值为-1)

从模式串 t 的最左边开始的那个字符记为t0
在模式串t 的第j个字符记为tj
所以用符号来表示即
当j = 0 时, next【j】 = -1;

当0<k<j && “t0t1…t(k-1)” == "t(j-k)t(j-k+1)…tj"时,
next【j】 = max(k);

不满足以上条件的都为,next【j】= 0;

实现代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char t[10000];
    while(~scanf("%s",t))
    {
      int j = 0,k = -1;
      int next[10000];
      next[0] = -1;
      while(j < strlen(t)-1)
      {
          if(k == -1 || t[j] == t[k])
          {
             j++;k++;
              next[j] = k;
          }
          else k = next[k];
       }
      for(int i = 0;i < strlen(t);i++) cout << next[i] << " ";
      cout << endl;
    }

    return 0;
}

next数组的作用

next数组的作用就是利用从模式串提取出来的加速匹配的有用信息来消除主串指针的回溯,减少时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值