KMP演算法 在文字中尋找目標字串

2022-02-06 03:43:04 字數 1752 閱讀 6179

/* 返回字串substr在str中首次出現的位置索引,

* 若不存在,返回-1。

*/int strstr(string str, string substr)

return -1;

}

這種演算法的大致流程如下:

如果使用kmp演算法的話,流程可以簡化為下圖:

這樣就有:

通過這些資料,我們就可以用來直接從字首跳到字尾所在的位置,從而不需要逐個比對中間那些字元。

i += j - next[j];

j = next[j];

情況1 (匹配的部分沒有公共前字尾)

在這種情況下,由於已經匹配的部分沒有公共前字尾,此時next[4]的值為0,所以原來已經匹配的部分可以全部跳過,然後重新與關鍵字索引next[4]的值比較。如果不匹配,就會回到匹配失效的情況。

情況2(匹配的部分有公共前字尾)

由於j = 4時,出現了 s 和 p 的不匹配,而已經匹配的部分包含公共前字尾 i ,這樣在我們令索引 i 跳到下乙個 字元 i 出現的位置。同時由於字首 i 在原來的位置是已經匹配的, 那麼跳轉到字尾 i 位置的時候也肯定是匹配的。我們將 j 設為索引 next[4](這裡 next[4] 的值為1)然後進行比較即可。

情況3(公共前字尾內部也含有公共前字尾)

情況4(關鍵字內匹配和不匹配的部分構成的子串含有公共前字尾 且 字首第乙個字元與字尾最後乙個字元 相等)

可以看到關鍵字子串 abacaba 內含公共前字尾 aba ,而如果在這裡將 next[6] 設定為 2 的話,則在比對的時候又是拿 a 來與 c 比較。同樣關鍵字子串 aba 的公共前字尾是 a,如果將 next[2] 設為 0,則同樣還是拿 a 和 c 做比較。結果一定會是匹配失效的,也就是最終會令j 變為 -1。這樣的話我們可以直接令 next[2] 和 next[6] 直接設定為 -1,以減少不必要的跳轉。

vectorconstruct_next(string key)

//不匹配時,尋找匹配子串的公共前字尾

else

pos = next[pos];

} return next;

}

3.kmp函式的實現

有了next陣列後,kmp函式的實現就會簡單的多了。這裡是kmp函式的實現:

int kmp(string text, string key)

} if (j == keylen)

return i;

else

return -1;

}

怎樣理解KMP演算法中模式串後移的目標位置?

到這裡大家對kmp應該有所了解,這裡就不對kmp的相關概念進行介紹了。kmp有個很基本的思想,就是當主串和模式串出現不匹配,需要進行下次匹配前,我們移動的是模式串,而非主串。例如 串 abdabc 和串 abc 注 計算機中模式串是不會移動的,所以這裡所說的 移動 也就是其下標 j 指向的變化 插播...

使用STL在DB塊中尋找相同字元

opn product db101 opn di 4 l p 2.0 t ld 100 l p 516.0 t md 1004 l 1 t md 1100 字串的迴圈次數 ll5 nop0 l p 514.0 用於對比db塊中的下乙個字串 l md 1100 md1100是自加1,迴圈變數 d t ...

演算法之尋找二維矩陣中的目標值

編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。該矩陣具有以下特性 每行的元素從左到右公升序排列。每列的元素從上到下公升序排列。示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14,17...