字串匹配演算法原理及其實現 KMP演算法篇

2021-10-07 04:42:13 字數 1119 閱讀 5553

所謂的字串匹配其實是乙個很常用的概念,小到我們平常遊戲中見到的敏感詞遮蔽,大到各種場景下的查詢操作都會用到字串匹配。字串匹配就是在文字串中搜尋模式串有沒有出現同樣的字串以及它的出現位置。

字串的匹配中比較常用的是暴力破解法,也稱為bf。

在第乙個文字串和模式串對齊方式中,我們先找到乙個匹配的位置,然後,從這個位置之後,文字串和模式串同時向後移動,直到乙個不匹配的位置。那麼此時問題來了,依照bf方法,我們應該做的就是重新「後退」 找到乙個新的匹配位置,這種方法顯然在面對大量字串時搜尋的時間會指數性的增長,並且在這之前匹配出的結果沒有得到有效的利用導致浪費,有什麼辦法可以利用之前匹配出的結果來改善bf方法嗎?

答案是肯定的,kmp演算法就是這種方法的改善型演算法。具體改善的地方是:當出現失配時,不必像bf一樣回溯,而是由上一次匹配到的位置向後,繼續移動至下乙個匹配的位置,

由此我們可以看出:

1.移動對齊方式只由文字串與模式串失配位置決定。

2.而與文字串與模式串失配位置的文字串字元無關。

3.也就是說,移動對齊方式只與模式串有關。

那麼,我們該如何判斷相應的距離並且可以做到快速訪問呢?答案就是用乙個陣列來實現,這個陣列我們叫做next陣列。

下面是next陣列的建立過程,它的核心部分是若匹配到模式串和文字串相等的位置,則兩個串的位置同時加1,並且把這個位置記入next陣列;反之,則從next陣列裡找到最近的匹配到的位置並從這裡開始繼續匹配。(核心**只有三句話,大家也可以想一下有沒有方法還可以繼續改進這個演算法)

void creatnext(string p, int next)

else//kmp演算法的三句核心部分。。。

}}

由此,我們可以知道,kmp演算法的特點是:

模式串和文字串的匹配是由左向右依次進行的,一旦出現不匹配的位置,則模式串從next陣列中得到需要移動到的位置,並重新進行匹配。

我曾經在別的**看到過乙個問題,

典型字串匹配演算法實現 單字串匹配演算法

部落格源址 相信大家對快捷鍵ctrl f是做什麼用的都應該很熟悉了,無論是文字編輯 網頁瀏覽等程式上它都意味著字串搜尋,我們提供乙個關鍵字,它將找到當前頁面上的所有該關鍵字所在的位置。關鍵字稱為模式串,在文字t中尋找模式串p出現的所有出現的位置,解決這種問題的演算法叫做字串匹配演算法。字串匹配演算法...

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

KMP字串匹配演算法的原理與實現

kmp演算法是一種改進的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。即確定下一次應該從那個位置重新開始...