字串匹配——KMP演算法中的next陣列理解
阿新 • • 發佈:2019-02-01
關於原理就不講了,只說下我對Next陣列的理解,希望可以讓你獲得靈光一閃。
其實最難的就是是j=Next[j];這麼一句話,當時思考了很長時間,終於明白的時候確實很興奮加得意。
#include<cstdio> #include<cstring> void getNext(int *Next,char* src){ int i,j; Next[0]=-1; i=0; j=-1; int N=strlen(src); while(i<N-1){ if(j==-1||src[i]==src[j]){ ++i; ++j; Next[i]=j; }else{ /* 理解難點:假設已經存在Next;假設是兩個字串在進行比較。 1. a)假設現在有兩個字串 src (傳入的完整字串,長度為 N ) 和 dest(不完全字串,從第i個位置到末尾,長度為 N-i ) 進行比較, b)假設Next陣列已經存在,則我回溯的時候就有位置了。 2. 若 src 從0到第j-1個位置,與dest相同, 但是 src 在第j個位置 與字串 dest 不相同, 3. 則 src 該回溯到Next[j]的位置重新進行比較 */ j=Next[j]; } } } int KMPMatch(char *father,char *son){ int i,j; i=0; j=0; int next[15]; getNext(next,son); while(i<strlen(father)){ if(j==-1||father[i]==son[j]){ ++i; ++j; }else{ j=next[j]; } //src的遊標j到達strlen(src),說明dest中存在src子串 if(j==strlen(son) ) return i-strlen(son); } return -1; } int main(){ char dest[]="ABC ABCABD ABC ABD"; char src[]="ABC ABD"; int res=KMPMatch(dest,src); printf("%d\n",res); return 0; }