[转]从头到尾彻底理解KMP http://blog.csdn.net/v_july_v/article/details/7041827
1 int* GetNextval(char* p){ 2 int pLen = strlen(p); 3 int *next=(int*)malloc(sizeof(int)*pLen);next[0] = -1; 4 int k=-1; 5 int j=0; 6 while(j<pLen-1){ 7 //p[k]表示前缀,p[j]表示后缀 8 if (k == -1 || p[j] == p[k]){ 9 ++j; 10 ++k; 11 if (p[j] != p[k]){next[j] = k;} 12 else{next[j] = next[k];} 13 } 14 else{k = next[k];} 15 } 16 return next; 17 }
1 int KmpSearch(char* s, char* p){ 2 int i = 0; 3 int j = 0; 4 int sLen = strlen(s); 5 int pLen = strlen(p); 6 int *next=GetNextval(p); 7 while (i < sLen && j < pLen){ 8 //如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ 9 if (j == -1 || s[i] == p[j]) { 10 i++; 11 j++; 12 } 13 else { 14 //如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] 15 //next[j]即为j所对应的next值 16 j = next[j]; 17 } 18 } 19 if (j == pLen){return i - j;} 20 return -1; 21 }