引言
刚开始学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数组的作用就是利用从模式串提取出来的加速匹配的有用信息来消除主串指针的回溯,减少时间复杂度。