kmp算法
阿新 • • 發佈:2017-07-08
clas code nbsp har urn cda ring kmp return
KMP的精髓就在於,用了一個線性的算法,得到了每次在pattern[ j ]發生失配時,應該讓pattern往後移動多少步,這個值對應於pattern [0, j - 1]的最長相等{前綴、後綴}的長度。這些值所存的數組叫做next數組。
關鍵是在於了解next數組的構成。
對於我自個兒來說,看一下下面這個求next的小例子就可以知道是怎樣做了。
pattern: ABCDABD
next[]: 0,0,0,0,1,2,0
代碼如下:
#include<iostream> using namespace std; #include<string> voidnextFun(char* str, int* next) { next[0] = 0; int k = 0; int len = strlen(str); for (int i = 1; i < len; i++) { while (k > 0 && str[k] != str[i]) k = next[k - 1]; if (str[i] == str[k]) { k++; } next[i] = k; } } intKMP(char* str, char* pattern, int* next) { int res = 0; int len = strlen(str), lenPat = strlen(pattern); int k = 0; for (int i = 0; i < len; i++) { while (k > 0 && str[i] != pattern[k]) k = next[k - 1]; if (str[i] == pattern[k]) k++;if (k == lenPat) { res++; cout << "the matching pattern is shifting "<<i-lenPat+1<<endl; k = next[k-1]; } } return res; }
kmp算法