詳解找來找去感覺還是這兩篇解釋的很好
kmp演算法(1):如何理解kmp
kmp演算法(2):其細微之處
next[i]=j,即模式串p[1-i]的最長的相同真前字尾的長度
#include "stdafx.h"
,因#include "string"
#include "iostream"
using namespace std;
void getnext(string p, int next)
}int kmp(string s, string p, int next)
{ int i, j;
int pl = p.size();
int sl = s.size();
for (i = 0, j = 0; i < sl&& j < pl;)//注意這裡不要用j
以下兩種方法互通,分別為以0為初始或以-1為初始
1.以0為初始i
0123
4567
8910p
abab
aaab
abanext01
當i=0,1 next[0],next[1]分別初始為0,1
當i=2,p的前2位為ab
next[1]=1
,則觀察ab
的前1
位和後1
位是否相同,不同,所以next[2]=1
(記住後面運算時若連1位相同都沒有則記為1
,即最小記為1,其實看後面就知道意思是next[i]=0+1=1
)當i=3,p的前3位為
aba
,因next[2]=1
,則觀察aba
的前1
位和後1
位是否相同,相同,則在原基礎上+1
,即next[3]=1+1=2
當i=4,p的前4位為abab
,因next[3]=2
,則觀察abab
的前2
位和後2
位是否相同,相同,則在原基礎上+1
,即next[4]=2+1=3
當i=5,p的前5位為ababa
,因next[4]=3
,則觀察ababa
的前3
位和後3
位是否相同,相同,則在原基礎上+1
,即next[5]=3+1=4
當i=6,p的前6位為ababaa
,因next[5]=4
,則觀察ababaa
的前4
位和後4
位是否相同,不相同,則在原基礎上-1
,觀察前3
位和後3
位是否相同,不同繼續-1
,直到觀察到前2
位和後2
位相同,若不同再繼續減,後觀察到前1位和後1位相同,則next[6]=1+1=2當i=7,p的前7位為
ababaaa
,因next[5]=2
,則觀察ababaaa
的前2
位和後2
位是否相同,不相同,則在原基礎上-1
,觀察前1
位和後1
位是否相同,相同,則next[7]=1+1=2……… 最終為i01
2345
6789
10pab
abaa
abab
anext01
1234
2234
52.以-1為初始i
0123
4567
8910p
abab
aaab
abanext-10
當i=0,1 next[0],next[1]分別初始為-1,0
當i=2,p的前2位為
ab
,因next[1]=0
,則next[1]+1=1
,觀察前1
位和後1
位是否相同,不同,則1-1=0
,到0為止,則next[2]=0
(1-1=0
中第乙個1的意思即前1位和後1位是否相同中的1)當i=3,p的前3位為
aba
,因next[2]=0
,則next[2]+1=1
,則觀察的前1
位和後1
位是否相同,相同,則next[3]=1
當i=4,p的前4位為abab
,因next[3]=1
,則next[3]+1=2
,則觀察前2
位和後2
位是否相同,相同,則next[4]=2
當i=5,p的前5位為ababa
,因next[4]=2
,則next[4]+1=3
,則觀察前3
位和後3
位是否相同,相同,則next[4]=3
當i=6,p的前6位為ababaa
,因next[5]=3
,則next[5]+1=4
,則觀察前4
位和後4
位是否相同,不相同;則觀察前3
位和後3
位是否相同,不同;則觀察前2
位和後2
位是否相同,不相同;則觀察前1
位和後1
位是否相同,相同,則next[6]=1
當i=7,p的前6位為ababaaa
,因next[6]=1
,則next[6]+1=2
,則觀察前2
位和後2
位是否相同,不相同;則觀察前1
位和後1
位是否相同,相同,則next[7]=1
………最終為i0
1234
5678
910pa
baba
aaba
banext-10
0123
1123
4倆種方法的關係
觀察發現法1的next陣列每項+1就是法2的next陣列,所以考試時無論用哪一種都是可以的,只要
分析或者看清
是以什麼為初值就行其實還可以理解為把法1的next陣列向右移1位,並把首位賦值位-1
資料結構筆記 KMP演算法
kmp演算法 每當一趟匹配過程中出現字元比較不等時,不需要回溯i指標,而是利用已經得到的部分匹配的結果將模式向右滑動盡可能遠的一段距離後,繼續比較 設主串為 s1s2s3.sn,模式串為p1p2p3.pm 需要解決的問題 當主串中第i和字元與模式串中第j個字元失配時,需要和模式串中哪個字元再比較?假...
資料結構 KMP演算法
求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...
資料結構 KMP演算法
在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...