KMP演算法總結

2021-10-05 02:34:11 字數 1179 閱讀 2146

kmp演算法的核心就是next陣列如何去求

求next陣列的**如下

int

getnext

(char ch,

int clen,

int next)

}————————————————

82947411

next陣列是什麼呢

就是記錄該元素前有多少個元素和首段的元素相同

next陣列的意思就是 next[i] = len; 長度為i的陣列的字首和字尾相等的最大長度-1。 例如abcdabc就是 next[7] = 3; 相等的字首和字尾最長是ab長度為3-1.

如何求next呢

假如我們想求下標為i的next的值

我們則需要看看next[- -i]的值是多少,假設next[- -i]=5;

則說明- -i前面有4(5-1)個首尾重複的。

然後我們只需要對比重複末尾的後乙個(下標也就是為5和- -i)的是否相同,相同的話則i的next值就是6(5+1)。

不相同則從紅色字型那裡開始重複,並且看next[5](也就是開端重複的末尾)的值是多少。

在next的code中值得注意的是,這個j有著兩個含義,第一是代表著j是next對應下標的值,第二就是代表開端重複的後乙個位置。

這為什麼j=next[j]

為什麼要求next呢

next的作用就是在遇到那個不匹配的字元,可以直接判斷出,不匹配字元前有多少個和開端是重複的,然後重複的那部分就可以不用進行匹配了。

然後直接從(副串)重複部分的後乙個字元那裡開始比較,這樣就比較快。

並且主串不用回流,只用一直加加加。

kmp主函式**

void

getnext

(int next[

],string t)

else k = next[k];}

}

主函式和next有點像,它的k=next[k]也是相同含義,k值移動開端的第k個元素。

若匹配成功則j++和k++

注意當k退到0的時候,則就直接j++和k++,相當於重新匹配。

這裡的j(也就是主串)的下標是一直在往後移,沒有回溯。

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陣列...