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 ...