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