对于KMP算法,最重要的是要把握其中的next数组的含义及求法
考虑一个模式字符串:b1b2...bn,定义next[s]如下:
next[s] is the longest proper prefix of b1b2...bs that is also a suffix of b1b2...bs
#include "kmp.h"
#include <string.h>
void makeNext(const char* patt, int* next){
int len = strlen(patt);
//next must be an array with len + 1 element
next[1] = 0;
int s = 0;
const char *p = patt - 1;
for (int t = 1; t < len; t++){
while (s > 0 && p[t + 1] != p[s + 1])
s = next[s];
if (p[t + 1] == p[s + 1]){
s += 1;
next[t + 1] = s;
}
else
next[t + 1] = 0;
}
}
int search(const char* src, const char* patt){
int pattLen = strlen(patt);
int srcLen = strlen(src);
int *next = new int[pattLen + 1];
memset(next, 0, (pattLen + 1) * sizeof(int));
makeNext(patt, next);
int i = 0;
int j = 0;
int result = -1;
for (i = 0; i < srcLen; i++){
while (j > 0 && src[i] != patt[j])
j = next[j];
if (src[i] == patt[j])
j++;
if (j == pattLen){
result = i - pattLen + 1;
break;
}
}
return result;
}
浙公网安备 33010602011771号