KMP演算法總結

2021-10-08 20:04:29 字數 563 閱讀 4896

kmp演算法是一種效能比較好的字串匹配演算法。

首先,在理解效能比較好的kmp演算法之前,我們首先要先想一下對於字串匹配的樸素暴力做法我們一般是怎麼做出來的。

舉個例子:

對於主串s[n],子串p[m]。我們要計算子串p[m]在主串**現的位置的話。核心**一般是下面這個樣子的:

for(int i=1;i<=n;i++)//關於主串

else

k++;

}if(flag)//說明匹配成功

cout《這種做法的時間複雜度是o(mn)的。

這種做法最大的時間浪費體現在每一次匹配不成功,子串p都要從頭開始與主串的下乙個字元進行匹配。

如果我們能夠對子串進行預處理,記錄下子串每個位置字尾和字首相等的最大長度,這樣我們每次在第二重迴圈中對j開始處理時就可以直接從當前位置的長度開始,而不必每次都從1開始,我們把每個位置的這些長度值所組成的陣列叫做next陣列。

我們求next陣列的核心**如下:

for (int i = 2, j = 0;i <= m;i++)

kmp演算法講解_1

KMP演算法總結

kmp題目重在理解next陣列的含義 next陣列的作用 next j 記錄模式串中第 j 個字元的最長公共字首長度 重要,這是它的意義所在 第二種理解方式,當模式串與主串失配時,跳回的位置。next len 即字串 0 結束標誌的next值 單個字串匹配時與週期有關 hdu 1711 模板題 33...

KMP演算法總結

kmp演算法是用來實現模式匹配的,其時間複雜度是o m n 具體原理見 其中有用到next陣列來計算子串中公共項的位數,簡單來說,就是子串遇到不匹配時,就查next資料來決定前進幾位 移動位數 已匹配的字元數 對應的部分匹配值 1 要不要減一看next陣列第一位是不是為1,個人覺得加一後是有好處的,...

KMP演算法總結

現在假設有兩個字串a bbc abcdab abcdabde,b abcdabd。現在要在a中找b。比較暴力的方法是直接搜尋 void gosearch 上述 最核心就是while迴圈,舉兩個例子說明其作用 還是選取b串作為說明。假設現在要求next 6 那麼當前的j next 5 1 next陣列...