參考:KMP入門級別算法詳解--終於解決了(next數組詳解)算法
https://blog.csdn.net/lee18254290736/article/details/77278769數組
在這裏討論的next數組的含義爲模式串p[j]以前前綴和後綴相等的個數,若都不相等則爲0。(特殊狀況,沒有前綴和後綴時,則爲-1,如next[0]=-1;當j==1時,p[1]前面只有一個字符,在這裏認爲next[1]=0).net
如下是計算next數組算法的代碼:blog
void getNext(char *p, int *next) { int j=0, k=-1; next[0] = -1; while (j<strlen(p) - 1) { if (k == -1 || p[j] == p[k]) { ++j; ++k; next[j] = k; } else k = next[k]; } }
對以上代碼的解析:字符串
首先,k 始終表明着模式串中當前j對應的p[j]以前前綴和後綴相等的個數,所以p[j] == p[k]時get
++j; ++k; next[j] = k;
當p[j] != p[k],則入門
k = next[k];
此時k 依然表明着模式串中當前j對應的p[j]以前前綴和後綴相等的個數,只不過個數變少了,例如p[j]以前的字符串爲acac.....acac,p[j]以前前綴和後綴相等的個數爲4,則k=next[4]=2,則可視爲ac.........ac。當p[j]仍是不等於p[k]時,再次執行class
k = next[k];
直至它們相等,或k==-1。當k==-1時,一定執行if語句中的代碼,使得當前next[j]=0。next
以上就是對獲取next數組算法的理解。while
配合如下代碼實現KMP算法:
int kmp(char* W,char* T,int* next){ int i = 0, j = 0; while (i<strlen(T)){ while (j != -1 && W[j] != T[i]){ j = next[j]; } if (j == strlen(W)-1){ return i - strlen(W) + 1; } else{ j++; i++; } } return -1; }