字串 之 KMP演算法

2021-06-18 16:06:05 字數 2338 閱讀 8493

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演算法是一種線性時間的的字串匹配演算法...