字串匹配的思路大致分幾種:
1、暴力匹配。
2、基於暴力匹配進行優化。
進行預計算,一旦發現失敗匹配之後,可以跳過更多的位置,減少無謂的浪費。
這篇文件提到了許多按這個思路實現的演算法各具特點
但最具代表性的演算法還是kmp,這篇文件講的非常詳細:
3、ac自動機。
根據原始字串,及模式字串,初始化dfa,計算出轉移矩陣。接下來檢驗原始字串是否可以被dfa所接受即可。
轉移矩陣在這種情況下為稀疏矩陣,為了壓縮空間,通常使用trie(字典樹)來實現。字典樹中的邊表示匹配路徑上的字元,節點儲存當前索引,next指標陣列,fail指標。
fail指標的指向,跟kmp演算法有共性,在匹配失敗時可以跳過無效的匹配。
關於ac自動機,可以參考這裡:
關於dfa的原理,可以參考這裡:
字典樹的應用:
在搜尋引擎的分詞操作中,使用的詞庫中的詞條數目往往幾十萬以上,為了保證切分速度,乙個好的詞庫查詢方法很重要。乙個比較經典的方法就是使用trie樹結構來組織詞條,使用樹節點儲存詞條中的字元,使用hash來尋找字元在trie樹中的位置,使用最大長度查詢方法來匹配詞條。
特殊字串模式識別
有些字串的模式有自己的內在規則,像**(86-13088438874)、位址(北京市朝陽區大望路)、組織機構(阿里巴巴集團****)等。
要識別這類字串,可以構造出不同規則的狀態機,進行規則的判斷和狀態跳轉。
4、hash值匹配。實現非常簡單的rabin-karp演算法。預計算出模式字串的hash code,然後依次從原始字串中取出模式字串等長的部分,計算其hash code,看兩個值是否相等。匹配失敗則後移一位,繼續匹配。
思路比較新穎,效率波動比較大。
可參考這篇文件:
dfa與kmp最優。
具體可參考這裡:
字串匹配問題 KMP匹配演算法
基本思想 字串匹配問題 在文字串中尋找是否有與模式串相同的子串 在字串匹配時,暴力匹配忽略了如果模式串開頭與中間有重複部分,在將模式串的後面的重複部分匹配後,無法繼續匹配的話,此時將模式串開頭實際上也已經被匹配了,可以直接從開頭重複部分之後開始匹配 這裡引入了乙個部分匹配值表,每個與模式串的字元對應...
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配問題 KMP演算法
kmp演算法 kmp是解字串匹配這類題目的演算法,又稱 看毛片 演算法。如下圖,給定乙個長度為n的文字,給定乙個長度為m 的字串,求該字串在給定文字的中出現的次數。kmp就是解決這一類題目的。i 1 zzkzzzkzzzkzkkkz zzkzzkzzkzzk j 1繼續考慮上面的問題。首先我相信每個...