KMP算法核心思想是:充分利用已成功匹配的信息来进行接下来的匹配。
主要是 nxt 数组的应用。
下面来说说 nxt 数组意义:
(1)nxt[0]= -1
(2)nxt[i]=k 表示模式串s[0,...,k-1]与s[i-k,...i-1]相同且最长
接下来考虑一下 nxt 数组的求法。
假设我们已经知道了 nxt [0,1,...,k],,模式串为s ,现在求 nxt[k+1] 的值
第一种情况,nxt[k]= pos= -1,这时nxt[k+1]= pos++ = 0
第二种情况,nxt[k]= pos!= -1,若s[k]= s[pos],这时nxt[k+1]= pos++;,,否则的话我们要沿着 nxt 找到nxt[pos]再重复此过程。
代码如下:
void get_nxt(){
int len = strlen(s);
nxt[0] = -1;
int i = 0, j = -1;
while (i < len){
if (j == -1){
nxt[i + 1] = j + 1;
i++; j++;
}
else{
if (s[j] == s[i]){
nxt[i + 1] = j + 1;
i++; j++;
}
else{
j = nxt[j];
}
}
}
}
下面是比较简洁的代码:
void get_nxt(){
int len = strlen(s);
nxt[0] = -1;
int i = 0, j = -1;
while (i < len){
if (j == -1 || s[j] == s[i]){
nxt[++i] = ++j;
}
else j = nxt[j];
}
}