zyf:
求失配的過程和最後比較的過程差不多,因為每次都是如果不匹配就跳到它失配的位置。kmp一開始看有點暈,你先要知道的是,它是先自己和自己弄,再和大串弄至於為什麼是這樣,可以想象一下失配也就是說頭和尾上的一段字串是一模一樣的,那麼我們在頭上不停地往前跳,也就相當於在結尾不停地往後跳(自己體會一下)。
i是a串(大串)的指標,j是b串(小串)的指標
e.g.
a b a b a b a b e
a b a b e
啊,你發現這裡炸了,因為b[1]=b[3],b[2]=b[4]你完全可以,直接這樣:
a b a b a b a b e
。。。。 a b a b e
而不是這樣:
a b a b a b a b e
. a b a b e
原理就是這樣,**實現上
預處理出這樣乙個陣列p[j],表示當匹配到b陣列的第j個字母而第j+1個字母不能匹配了時,新的j最大是多少。
這樣可以使得a[i-j+1..i]與b[1..j]保持匹配(此處為新的j)。
然後,下一位如果還是不能匹配,再把前乙個j翻出來,再匹配一次,直到找不到相同的字首了也就是j=0了,就只能把整個串往後挪一位了
#include
#include
#include
using
namespace
std;
const
int maxn=1000001;
char a[maxn],b[maxn];
int la,lb,p[maxn];
int main()
j=0;
for (int i=1; i<=la; i++)
}for (int i=1; i<=lb; i++) printf("%d ",p[i]);
return
0;}
KMP演算法詳解及模板
kmp 演算法是用來解決單模匹配問題的一種演算法。如果暴力的進行單模匹配,那麼時間複雜度為o nm kmp 演算法通過對模式串的預處理優化了複雜度。為了敘述方便,設模式串長度為n,主串長度為m。將模式串稱為s1,主串稱為s2,下標從1 開始。我們首先對模式串預處理出乙個next 陣列。next i ...
KMP演算法模板與解析
全部資料結構 演算法及應用課內模板 將kmp演算法,就要先講講它是用來幹什麼的,為什麼叫這個名字,暴力的演算法又是怎樣的 kmp是三人knuth,morris,pratt,他們仨發明了這個演算法,所以叫kmp。不要驚訝。然後它是用來解決字串的模式匹配問題 大白話就是找子串 舉個例子說就是,給你乙個主...
KMP演算法總結與模板
發現學了好久了kmp了,模板卻總是背不會,感覺自己還是沒有理解深刻,僅以此作為複習 給定乙個模式串s長度為m,和模板串p長度為n,求解模板串p在模式串s 現的位置 模板串p需要同模式串s匹配很多次,當乙個字元匹配失效時,傳統的演算法往往模板串p會整個從頭開始,導致演算法的時間複雜度是o m n o ...