資料結構 KMP演算法

2021-08-09 18:26:22 字數 777 閱讀 1167

在我的理解,kmp演算法最核心的同時最難理解的是這個next()函式。但是,next()的值是挺好求的,難在哪呢?

這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t=「ababaaa"的next[j]的函式值

是這樣的,當j=0,next[0]=-1,對於任何子串,第乙個元素的next()函式值都為-1

當j=1時,next[1]=0;

當j=2時,next[2]=0,因為t1!=t0。

當j=3時,next[3]=1,因為t0=t2。

當j=4時,next[4]=2,因為t0t1=t2t3='ab'。

當j=5時,next[5]=3,因為t0t1t2=t2t3t4='aba'。

當j=6時,next[6]=1,因為t5=t0='a'。

是的,看懂了嗎,next的值其實就是看子串的前k個值與字串當前位置(沒匹配上)的前k個是否相等,next[j]=k。

之後,說完這個函式,可以直接對kmp演算法進行總結:

設s為主串,t為模式串,i為主串當前比較字元的下標,j為模式串當前比較字元的下標。令i=start,j初值為0,當si=tj時,i和j分別增加1,再繼續比較

否則,i的值不變,j的值改變為next【j】的值再繼續比較。這時分倆種情況

1.j 退回到某個j=next【j】值時,si=tj,此時i和j分別加1,繼續比較

2.j退回到j= -1,令 主串跟模式串的下標各增加1,接著比較si+1和t0,

這樣的迴圈過程直到下標i大於等於主串,或下標j大於等於模式串t的長度時為止。

資料結構 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演算法

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

資料結構 KMP演算法

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