模式串匹配 KMP

2021-08-31 17:19:17 字數 1052 閱讀 9429

樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o(m*n),而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。

kmp演算法的緊隨便是覆蓋函式next。當模式串p[j]和文字串s[i]失配時,j指標不是簡單的回溯,而是指向next[j]。

覆蓋函式next如何定義呢,它本質上是找到即是模式串p的字首,又是它的字尾的最長字串,即找到最大的k使得p[0]p[1]....p[k-1]=p[j-k]p[j-k+1]..p[j-1],然後將next[j]賦值為k。當然,這樣的賦值並非最優化,注意到如果p[j]=p[k],那next[j]和s[i]也必然失配,因此要遞迴的找到乙個k使得p[j]!=p[k].

以下是kmp演算法的**:

#includeusing namespace std;

void get_nextval(char const* ptrn, int plen, int* nextval)

else //迴圈的else部分

j = nextval[j];

} } void get_next(char const* ptrn, int plen, int* nextval)

else //迴圈的else部分

j = nextval[j]; //遞推

} } int kmp_search(char const* src, int slen, char const* patn, int plen, int const* nextval, int pos)

else

} if( j >= plen )

return i-plen;

else

return -1;

}

int main()

; int next[9];

get_nextval(p,9,next);

for(int i=0;i<9;++i)

cout<

模式串匹配,kmp

include include include include define maxstrlen 255 可以在255以內定義最大串長 typedef char sstring maxstrlen 1 0號單元存放串的長度 void get next sstring t,int next void ...

kmp模式串匹配

作用 字串匹配 我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。如果有則返回出現了t的首位字元位置 當然,這個陣列是從0開始 如果沒有則返回0。通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。下面的描述 strin...

KMP模式串匹配

查詢在乙個很長n的 文字串 中,給定的很短m的 模式串 的出現有無,次數,位置 複雜度o n m 而不是暴力的o n m 這裡對模式串做了乙個神奇的移位法則,注意kmp是只針對模式串的操作,不是文字串 我喜歡把kmp叫做 對應的前一項字首位置 例如 kmp記錄的是怎麼一回事,看圖看資料馬上就明白了 ...