演算法 KMP演算法 解釋

2021-10-03 16:03:20 字數 3292 閱讀 3136

1.詳解kmp演算法

2.《大話資料結構》

3,kmp演算法易懂版

kmp演算法由d.e.knuth、j.h.morris和v.r.pratt發表的模式匹配演算法。

kmp演算法要解決的問題就是在字串(也叫主串)中的模式(pattern)定位問題。

例子:輸入:主串(s=abeabx),子串(t=abx)

輸出:返回子串的具體位置(3)。

又比如:

輸入:主串(s=abeabx),子串(t=abz)

輸出:無該子串(-1)。

package swardoffer;

public

class

kmpelse}if

(j == t.length)

else

}public

static

void

main

(string[

] args)

}

暴力破解複雜度太高,如何讓指標不回溯?

(1)找到s串和t串不匹配的位置,此時i=5

(2)找到t串[0,4],即"ababa",找到它的最大公共前字尾,「aba」

(3)t串向右移最大公共前字尾長度-1位

也就是說,第最大公共前字尾長度+1位,「b」,第4位和當前主串指向的字元比較。

}解釋:

子串是ababaaaba

next的值:

0,1

,2,3

,4,5

,6,7

,8//j a,b,a,b,a,a,a,b,a //t-1

,0,0

,1,2

,3,1

,1,2

//next

(1)當i=0,j=-1時,next[1]=0

(2)此時,i=1,j=0,t[i]=b,t[j]=a,t[i]和t[j]不相等,j=next[0]=-1,

(3)此時,i=1,j=-1,next[2]=0

(4)此時,i=2,j=0,t[i]=a,t[j]=a,t[i]和t[j]相等,next[3]=1

(5)此時,i=3,j=1,t[i]=b,t[j]=b,t[i]和t[j]相等,next[4]=2

(6)此時,i=4,j=2,t[i]=a,t[j]=a,t[i]和t[j]相等,next[5]=3

最長公共前字尾子串是"aba"

(7)此時,i=5,j=3,t[i]=a,t[j]=b,t[i]和t[j]不相等,j=next[3]=1

「abab」!=「abaa」,要找" a,b,a,b,a,a"的最長公共前字尾子串

//---------------------0,

1,2,

3,4,

5,6,

7,8//i=5

|i a,b,a,b,a,a,a,b,a //t

|j 0,1

,2,3

,4,5

,6,7

,8//j=3

(8)此時,i=5,j=1,t[i]=a,t[j]=b,t[i]和t[j]不相等,j=next[1]=0

//--------------------j=next[3]=10,

1,2,

3,4,

5,6,

7,8//i=5

|i a,b,a,b,a,a,a,b,a //t

|j 0,1

,2,3

,4,5

,6,7

,8//j=3

//--------------------j=next[1]=00,

1,2,

3,4,

5,6,

7,8//i=5

|i a,b,a,b,a,a,a,b,a //t

|j 0,

1,2,

3,4,

5,6,

7,8//j=3

(9)此時,i=5,j=0,t[i]=a,t[j]=a,t[i]和t[j]相等,next[6]=1

…總結:

如果t[i]和t[j]相等,next[j+1] =j+1= next[j] + 1。

如果不相等,對於j=5,「abab」!=「abaa」,相當於"aba"和"baa"找最長子串,相當於aba是t串,baa是s串,所以j值回溯到next[j],t[i]和t[j]再進行比較。

缺陷:此時不必比較:

}改進與改進之前的對比:

0,1

,2,3

,4,5

,6,7

,8//j a,b, a,b, a,a,a,b, a //t-1

,0,0

,1,2

,3,1

,1,2

//原next-1

,0,-

1,0,

-1,3

,1,0

,-1//現next

KMP演算法解釋

有些演算法,適合從它產生的動機,如何設計與解決問題這樣正向地去介紹。但kmp演算法真的不適合這樣去學。最好的辦法是先搞清楚它所用的資料結構是什麼,再搞清楚怎麼用,最後為什麼的問題就會有恍然大悟的感覺。我試著從這個思路再介紹一下。大家只需要記住一點,pmt是什麼東西。然後自己臨時推這個演算法也是能推出...

KMP 演算法簡單解釋

講kmp演算法,離不開bf,實際上,kmp就是bf公升級版,主要流程和bf一樣 不同是在匹配失敗時能利用子串的特徵減少回溯,利用根據子串特徵生成的next陣列來減少 所有陣列下標都是從0開始 int brute force 1 const char s,const char t if j lent ...

KMP詳細解釋及KMP演算法模板

kmp是什麼,kmp解決什麼型別的問題 kmp全稱為knuth morris pratt演算法,是一種高效的字串匹配演算法,尋找乙個字串中是否包含另乙個字串,例如 char s ababababcab char p ababc s為模板串 主串 p為子串,在s中找到p的位置 暴力匹配演算法 o n ...