kmp演算法:字串匹配的一種基本演算法,比如:在bab abcaabcda中匹配字串abcd(即在母串中檢視是否包涵字串)
對字串abcd進行檢索:
第一步:
發現a與b不匹配則,把a向後移動一位
第二步:
發現第乙個字元a匹配,再尋找第二個字元b也匹配,再尋找第三個字元c不匹配,按照往常的做法將字串abcd整體後移一位,這樣的方法最終可以找到字串,但是過於耗時,下面進行kmp匹配,由於前面兩項ab已經匹配,利用已經匹配的字串計算後移的位數為2(怎麼計算的最後講解)
第三步:
發現a與母串不匹配則向後移動一位
第四步:
發現abc都匹配,但是最後乙個d與母串不匹配,則通過計算得到應向後移動3位
第五步:
發現第乙個字元a可以匹配但是第二個b不匹配,則通過計算將字串向後移動一位
第六步:
找到最後要匹配的字串
abc的字首字串為a,ab,字尾字串為b,bc共有字串長度沒有,故長度為0 ,則後移的位數為3-0=3
abcdab的字首字串為a,ab,abc,abcd,abcda字尾字串為b,ab,dab,cdab,bcdab共有字串為ab,則後移的位數為6-2=4
python實現:
str_next=[-999]*32
def get_next(t,str_next):
k=-1
j=0str_next[j]=k
while(j
if((k==-1) or (t[j]==t[k])):
k=k+1;
j=j+1;
str_next[j]=k
else:
k=str_next[k]
def kmp(s,t,pos):
i=pos
j=0while((i
if((j==-1) or (s[i]==t[j])):
i=i+1
j=j+1
else:
j=str_next[j]
if(len(t)==j):
return i-len(t)
else:
return -1
if __name__ == "__main__":
s="abcabcabcacbab"
t="abcac"
pos=0
get_next(t,str_next)
index=kmp(s,t,pos)
print (index)
KMP匹配演算法
1.概述 在講解kmp匹配演算法之前,我們不妨來看看我們用暴力法是怎麼完成字串的匹配的.在我們的目標串t 101011011,和模式串p 110中,我們在t中找尋p第一次出現在t中的下標.通過上圖,我們發現我們利用暴力匹配法,在某次失敗後我們只能非常機械的一步一步移動我們的模式串p.所以我們理解了上...
演算法 kmp匹配演算法
執行結果 心得收穫 完整 計算next陣列 next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭 時間複雜的 o m void calnextarray const string str,int...
模式匹配演算法 KMP演算法
一.基本概念 真字首指的是除了本身以外字串全部頭部的組合,真字尾指的是除了本身以外字串全部尾部的組合。二.簡單的模式匹配演算法 按照正常的思維,字串可以進行暴力匹配,如下。int index bf string s,string p else if j p len else return 1 暴力匹...