字串匹配之KMP演算法

2021-10-08 06:20:25 字數 2579 閱讀 7249

字首:指的是字串的子串中從原串最前面開始的子串,如abcd的字首有:a,ab,abc,

字尾:指的是字串的子串中在原串結尾處結尾的子串,如abcd的字尾有: d,cd,bcd

next陣列:next[i]表示的是前i的字元組成的這個子串字首和字尾相等的最長串的長度

舉個例子:

例如字串abcadefabca的字首字尾相等的有a和abca,那麼其中最長的就是abca。

例如:a="abecdeabceadeabceab "

b="eabceab"

先手動計算出各個next的值:

b ="e a b c e a b"

next = 0 0 0 0 1 2 3

(這裡在解釋下next的求解,防止有同學沒看明白失去了繼續往下讀的熱情,比如a->2這個怎麼求出來的呢?原子串是:eabcea,字首有:e,ea,eab, eabc, eabce。字尾:a, ea, cea, bcea, abcea。字首字尾相同的是ea,長度是2)

用i表示當前a串要匹配的位置(即還未匹配),j表示當前b串匹配的位置(同樣也是還未匹配)。若i>0則說明i-1是已經匹配的(j同理).

(1)、從i=0,j=0位置開始,a不等於e,並且j為0,表示e已經是b串的頭了,所以只能向後移動i。

(2)、當i=2時a串可以和b串可以和匹配,i++,j++,i=3,j=1此時不相等:

(3)、因為j不是0所以此時需要看b串向右移動的位置,移動的位置就是next[j-1] 的值,這一步該值是0,說明又要從b串頭位置開始:

(4)、繼續重複步驟(1),直到i=5時又有匹配,當i=11,j=6時有出現不匹配情況:

(5)、處理b串的跳轉,查詢next[j-1]的值,j=6,得 2,所以將b串2位置移動到當前:

(6)、i=11,j=2並不匹配,在繼續執行(1),直到i=12時有再次匹配上,此時就可以找到我們想要的串。

上面的流程重點是b串的跳轉,為什麼需要根據next記錄跳轉呢?雖然i位置和j位置不相等時,但是i-1和j-1是相等的,j-1是j-1串的字尾,如果存在字首的話需要從字首結束的位置嘗試匹配,所以需要跳轉到字首結束的位置。

上面介紹了b串匹配演算法步驟,剩下的問題就是b串的next如何計算?總不能靠人工計算吧。next的計算其實是自己查詢自己,在開始演算法介紹前先約定一些事項:

next[0]是-1,沒有字首和字尾匹配的是-1,next 記錄的是最大字首和字尾匹配位置(這裡是位置不是長度,長度=位置+1)。

(1)、i=0,j=0根據上面的約束next[0]=-1

(2)、i向後移動,i=1此時j=0,a和e不相等,無字首和字尾相等next[1]=-1

(3)、i向後移動,i=2同上

(4)、i向後移動,i=3同上

(5)、i向後移動,i=4,此時j依然還是0,此時相等,記錄匹配位置next[4]=0,然後j++。

(6)、i向後移動,i=5,此時j是1,此時相等,記錄匹配位置next[5]=1,然後j++。

(7)、i向後移動,i=6,此時j是2,此時相等,記錄匹配位置next[6]=2,然後j++。

假如b後面還有一位b又改如何處理?

i=7,此時j是3,此時b和c不相等,j重新跳到0,j=0,next[7]=-1。又回到了步驟(1)。

求解next上面的子串很類似,求解子串是原串和子串匹配,next是子串的最大字首和最大字尾匹配。搞清楚這點理解起來就容易多了。

最後看下求next的**是不是有種豁然開朗的感覺

for (int i=1;i=0))

j=next[j];

if (b[j+1]==b[i])

next[i]=j+1;

else

next[i]=-1;

}

字串匹配之KMP演算法

以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。廢話不說了,我們直接入題。說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法...

演算法 字串匹配之KMP

說人話就是 比如有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,kmp演算法是最常用的之一。首先對於上面的 比如 我們首先要針對搜尋詞 abcdabd 算出一張 部分匹配表 接下來就很簡單了,將字串和搜尋詞都從...

字串匹配之KMP演算法

問題定義 字串匹配即是在所有文字t中,找出模式p的所有出現。字串匹配常用的演算法有 樸素演算法 rabin karp演算法 有限自動機演算法 kmp演算法 所有演算法中,算kmp演算法效率最高。也較為難理解。作者曾經認真看了3遍嚴蔚敏的 資料結構 遺憾的是沒有看懂,搞得我一度懷疑自己的智商很低。今天...