Files
912-notes/thu_dsa/chp11/kmp.cpp
2019-08-28 14:13:54 +08:00

29 lines
545 B
C++

#include "kmp.h"
#include <iostream>
int* makeNext(char* str){
int* next;
int len, i = 0, j = -1;
for (len = 0; str[len] != '\0'; ++len);
next = new int[len];
next[0] = -1;
while(i < len - 1){
if(j < 0 || str[i] == str[j]) next[++i] = ++j;
else j = next[j];
}
return next;
}
int match(char* text, char* pattern){
int* next = makeNext(pattern);
int i = 0, j = 0, m = strlen(text), n = strlen(pattern);
while(i < m && j < n){
if(j < 0 || text[i] == pattern[j]){
++i;
++j;
}
else j = next[j];
}
return i - j;
}