kmp演算法是一種改進的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。
在介紹kmp演算法之前,先介紹一下bf演算法。
一.bf演算法
bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元;若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配結果。
舉例說明:
s: ababcababa
p: ababa
bf演算法匹配的步驟如下
i=0 i=1 i=2 i=3 i=4
第一趟:
ababcababa 第二趟:a
babcababa 第三趟:ab
abcababa 第四趟:aba
bcababa 第五趟:abab
cababaaba
baababa ab
aba aba
ba abab
aj=0 j=1 j=2 j=3 j=4(i和j回溯)
i=1 i=2 i=3 i=4 i=3
第六趟:a
babcababa 第七趟:ab
abcababa 第八趟:aba
bcababa 第九趟:abab
cababa 第十趟:aba
bcababa
ababa
ababa a
baba ab
aba
ababa
j=0 j=0 j=1 j=2(i和j回溯) j=0
i=4 i=5 i=6 i=7 i=8
第十一趟:abab
cababa 第十二趟:ababc
ababa 第十三趟:ababca
baba 第十四趟:ababcab
aba 第十五趟:ababcababa
ababa
ababa a
baba ab
aba ababa
j=0 j=0 j=1 j=2 j=3
i=9
第十六趟:ababcabab
aabab
aj=4(匹配成功)
**實現:
int bfmatch(char *s,char *p)
}if(j==0)
next[i]=0;}}
}bool equals(char *p,int i,int j) //判斷p[0...j-1]與p[i-j...i-1]是否相等
return true;
}
字串之KMP演算法
kmp演算法全稱knuth morris pratt演算法,是一種字串匹配演算法,常規字元匹配是每次移動一位,複雜度o mn 而kmp演算法複雜度o m n kmp演算法利用的是目標字串 要匹配的字串,如下圖第二行 前字尾有相同的子字串和在匹配過程中前i 1個字元已經匹配過的規律。匹配過程 部分匹配...
字串之KMP演算法
kmp演算法用於字串匹配 比如 如何在 abdasjfasdfnadj 中判斷是否存在sjf,以及匹配的位置 容易想到的是將sjf挨個與母串進行匹配,當不匹配時,子串右移一位,繼續挨個匹配,這樣的話,複雜度為o mn 可以發現,這個暴力的方法中存在一些重複,子串右移一位,相當於忽略了上次匹配時的資訊...
字串匹配之KMP演算法
以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。廢話不說了,我們直接入題。說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法...