kmp演算法這篇寫的很好,非常好理解
這個演算法用來做字串匹配。
字串匹配是計算機的基本任務之一。
如果給出兩個字串text 和 pattern ,需要判斷字串pattern 是否為字串text 的子串。一般把字串text 稱為文字串,而把字串pattern 稱為模式串。
舉例來說,有乙個字串"bbc abcdab abcdabcdabde",我想知道,裡面是否包含另乙個字串"abcdabd"?
可以用暴力的列舉方法,但這麼做時間複雜度為o(nm),用kmp演算法,時間複雜度o(n+m).
許多演算法可以完成這個任務,knuth-morris-pratt演算法(簡稱kmp)是最常用的之一。它以三個發明者命名,起頭的那個k就是著名科學家donald knuth。
假設有乙個字串s,以i位作為結尾的子串為s[0…i]。對該字串來說,長度為k+1的字首和字尾分別是s[0…k] 、s[i-k…i]。現定義乙個int型陣列next(不要在意名字)。next[i]表示使子串s[0…i] 的字首 s[0…k] 等於 字尾 s[i-k…i] 的最大的 k(注意字首跟字尾可以部分重疊,但不能是s[0…i] 本身),如果找不到相等的前字尾,那麼就令next[i] = -1。顯然,next[i]就是所求最長相等前字尾中字首的最後一位的下標(長度減一)。
求解過程
(1)初始化next陣列,令j=next[0]=-1.
(2)讓i在1~len-1 範圍遍歷,對每個i,執行(3)(4),以求解next[i].
(3)不斷令j=next[j],直到j回退為-1,或s[i]==s[j+1]成立。
(4)如果s[j]==s[j]+1,則next[i]=j+1;否則next[i]=j。
//getnext求解長度為len的字串s的next陣列
void
getnext
(char s,
int len)
if(s[i]
== s[j+1]
) next[i]
=j;}
}
記錄KMP演算法,記錄其經典之處。。。
離開學校已經多年了,早已經不再撫弄那些陳舊的書籍。週末,深圳的天氣陰沉,老天這段時間總是很樂意顯擺,動不動就給深圳人民來次幾十年一遇的暴雨,似乎要把一年的雨水全部在這些天下完似的。所以呆在家裡面看電視,上網,實在也無聊。隨手翻開大學時候的 資料結構,還留著啊,當初剛出來的時候總沒有底氣,總希望能夠隨...
記錄KMP演算法,記錄其經典之處。。。
離開學校已經多年了,早已經不再撫弄那些陳舊的書籍。週末,深圳的天氣陰沉,老天這段時間總是很樂意顯擺,動不動就給深圳人民來次幾十年一遇的暴雨,似乎要把一年的雨水全部在這些天下完似的。所以呆在家裡面看電視,上網,實在也無聊。隨手翻開大學時候的 資料結構,還留著啊,當初剛出來的時候總沒有底氣,總希望能夠隨...
c 學習KMP演算法的記錄
kmp大名鼎鼎,看過面經說手撕kmp,趕緊複習一下。這個人的kmp實話實說寫的非常好!傳送一下子 void get next string t,vector next else int main string t vector next t.size get next t,next int i 0,...