標籤:kmp演算法 最佳化
由於KMP演算法比較難,所以建議初學者分兩個階段學習。
第一個階段先理解演算法思想,可以參考這篇文章:點擊開啟連結
第二個階段,理解演算法的具體實現,本文主要講解這部分,需要注意的地方都在程式裡了,自己看吧
程式(調試通過):
#include <stdio.h>#include <string.h>int KMP(char* s, char* pattern, int start, int next[]);void get_new_next(char* pattern, int next[]);int main(){ int n; char* s= "lakgjkaglamdaltjie"; char* pattern= "lamd"; int next[5]; //長度為strlen(pattern)+1 int start = 0; //從start處開始搜尋字串s get_new_next(pattern, next); n = KMP(s, pattern, start, next); printf("%d\n",n); return 0;}//返回pattern在字串s中匹配的第一個位置,例如:本例返回3int KMP(char* s, char* pattern, int start, int next[]){ int i = start, j = 1; while (i<=(int)strlen(s) && j<=(int)strlen(pattern)) { if(j==0 || s[i]==pattern[j-1]) //找到第一個匹配的字元,然後每次移動1位繼續匹配 { i++; j++; } else j = next[j]; //匹配失敗,則尋找部分匹配表,移動若干位 } if(j>(int)strlen(pattern)) return i-strlen(pattern)+1; else return -1; //Not found}//最佳化後的get_new_next函數(構造next[]的部分匹配表)void get_new_next(char* pattern, int next[]){ int k=-1,j=0; next[0]=-1; while (pattern[j]!='\0') //迴圈直到pattern遇到結束符 { //如果j的前面k個字元與開頭的k個字元不相等 while(k!=-1 && pattern[k]!=pattern[j]) k = next[k]; j++; k++; //如果j的前面k個字元與開頭的k個字元相等 if(pattern[k] == pattern[j]) next[j] = next[k]; else next[j] = k; //pattern[k]!=pattern[j](1<=k<j) }}
字串匹配KMP演算法實現