資料結構 KMP演算法

2021-06-25 13:20:26 字數 1413 閱讀 8443

求串的模式值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]=-1,因t[3]=t[6]

(3)next[j]=k 意義:模式串t中下標為j的字元,如果j的前面k個字元與開頭的

k個字元相等,且

t[j] !=t[k] (1

≤k)。

即t[0]t[1]t[2]

。。。t[k-1]==

t[j-k]t[j-k+1]t[j-k+2]…t[j-1]且t[j] != t[k].(1≤k);

(4)next[j]=0 意義:除(1)(2)(3)的其他情況。

此種求值方法只要記住會用就好,這是3位名人想出的!

具體**附下:參考(

#include #include using namespace std;

void get_nextval(const char *t, int next)

else

k = next[k]; }}

int kmp(const char *text,const char* pattern) //const 表示函式內部不會改變這個引數的值。

int *next=new int[len+1];

get_nextval(pattern,next);//求pattern的next函式值

int index=0,i=0,j=0;

while(text[i]!='\0' && pattern[j]!='\0' )

else

}}//while

delete next;

if(pattern[j]=='\0')

return index;// 匹配成功

else

return -1;

}int main()

{ char* text="bababcabcadcaabcaab";

char*pattern="bcabcad";

cout<

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...

資料結構 KMP演算法

要完善乙個string字串類,那麼實現查詢子串的功能是必不可少的,實現子串查詢可以使用樸素演算法,每次匹配乙個字元後向右移動乙個位置,這樣執行下來效率是比較低的,所以就有了kmp演算法,它能夠準確的知道當前字元不匹配後字串應該向右移動多少位,由於剛接觸kmp演算法,所以很多還明白的不是很透徹,在此記...

資料結構 KMP演算法

課本知識和競賽用的還是略微有些差別 比如 abcabaa 按照最長公共前字尾的求法 先得到 0001211 之後去掉最後一位,得到000121,再把第一位賦值為 1 即 1000121,這個就是我們一般做oj題用的所謂next陣列 但是按照課本的求法 你會發現結果卻是0111232,include ...