不知道看了幾遍的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, intnext)
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,...