int *text(字符串文本),int *pattern(即需要匹配的字符串)
KMP算法即是字符串匹配算法,常规解法是遍历text文本字符串,同时pattern跟着移动,当出现不匹配的字符时,text需要回到第二位,pattern需要回到0位,继续往后遍历,
直到pattern字符串完全匹配。显然此种算法比较暴力。
而KMP算法核心是对pattern字符串进行回溯(计算pattern字符串里相同的最大子串记录到next数组里面),计算共同前缀和后缀相同数然后记录到next回溯数组里面,在text里遍历的时候,当不匹配的时候,text中的i将不需要回到前面,只需要将pattern的j位置移动到next(j-1)的位置,继续和text字符串文本进行比对,算法结束。
next计算方法:
void make_next(int* pattern, int* next){
int p, k;
int m = strlen(pattern);
for(p=0, k=0; p<m; p++){
while(k>0 && pattern[p] != pattern[k]){
k = next[k-1];
}
if (pattern[p] == pattern[k]){
k++;
}
netx[p] = k;
}
}
然后再和text文本字符串里进行比较
int kmp(int* text, int* pattern, int* next){
int i, j;
int n = strlen(text);
int m = strlen(pattern);
make_next(pattern, next);
for(i=0, j=0; i<n; i++){
while(j>0 && text[i] != pattern[j]){
j = next[j-1];
}
if(text[i] == pattern[j]){
j++;
}
if(j == m){
break;
}
}
return i-m+1;
}
原文:https://www.cnblogs.com/wxj999/p/14352566.html