演算法之美 3 2 3 KMP演算法

2021-09-07 09:11:48 字數 1494 閱讀 3635

不知道看了幾遍的kmp,反正到現在都沒有弄清楚next[j]的計算和kmp的**實現,溫故而知新,經常回來看看,相信慢慢的就回了

從頭到尾徹底理解kmp

/*

!* \file kmp_演算法.cpp

** \author ranjiewen

* \date 2017/02/12 16:12**/

void prekmp(const

char* pattern, int m, int kmpnext) //

和getnextval等價

i++;

j++;

if (pattern[i] ==pattern[j])

else

}}#include

using

namespace

std;

#include

void kmp(string p, string

t)

const

char* x =p.c_str();

const

char* y =t.c_str();

int i = 0, j = 0, kmpnext[128

]; prekmp(x, m, kmpnext);

i = j = 0

;

while (ij++;

i++;

if (j >=m)

}}int main(int argc, char**ar**)

void getnext(char* p, int

next)

else

//當不匹配時,更新新的字首下標

}}//

優化的地方

//當p[j] != s[i] 時,下次匹配必然是p[next[j]] 跟s[i]匹配,如果p[j] = p[next[j]],必然導致後一步匹配失敗(因為p[j]已經跟s[i]失配,

//然後你還用跟p[j]等同的值p[next[j]]去跟s[i]匹配,很顯然,必然失配),所以不能允許p[j] = p[next[j]]。

//優化過後的next 陣列求法

void getnextval(char* p, int

next)

else

}}int kmpsearch(char* s, char*p)

; getnextval(p,next);

while (i < slen && j else

}if (j ==plen)

return i -j; //此處i-j才是字串開始匹配的地方

else

return -1

;}

有這樣寫的,else效果就是j==-1的時候

while (text[i] != '

\0' && pattern[j] != '\0'

)

else}}

//while

演算法之KMP

kmp演算法是一種字串匹配演算法,時間複雜度為 m n 個人對演算法學習還在初級階段。以前對字串匹配用暴力匹配演算法。暴力匹配演算法 兩個字串,模板串mo和文字串s。如果用暴力演算法,對於模板串mo,用i表示模板串匹配的位置。用j表示文字串匹配的位置。1,如果從一開始匹配的上,i和j同時增加。2,當...

KMP演算法之k next Pk

最近在看 大話資料結構 在串這章中,講到關於kmp演算法。其中關於在一直前j個next值,如何求得j 1的值,有個公式一直不是很理解,後來查了下資料,終於搞懂了。模式字串記為p 下標從0開始 next q k 表示p q 之前的子串中,存在長度為k的相同字首和字尾,即p 0 p k 1 與p q k...

hihoCoder之KMP演算法

本分類記錄了本人在hihocode上面嘗試的結果,現在分享出來,大家一起學習。小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了乙隻河蟹,於是河蟹就向小hi和小ho提出了那個經典的問題 小hi和小ho,...