字串匹配演算法
1、字串相關的演算法很多,今天總結的是字串匹配演算法,之前已知的有兩種演算法,一種叫做bf(brute force)演算法,也就是蠻力演算法,就是匹配串和模式串左對齊,不匹配則模式串向右移乙個單位,直到匹配或結束,這中間有很多無用的匹配,特別是對匹配串中有重複字串出現的時候;第二種就是第一種方法的改進,叫做kmp演算法,此演算法晦澀難懂,但歸根結底就兩句話,一是找出匹配串的next陣列,二是不匹配時的移動規則。bf演算法比較簡單,此不詳述,下面給出了kmp演算法,已在vs2005上除錯通過。
//contact是乙個類——聯絡人,匹配的是**號碼
void kmp(contact &c, string partstr)
else if (-1 == next[str_i])
} else
} if (str_i == tmpstr.length())
cout< }
//對於匹配串每個元素對應的next陣列中的值是其前面字串字首等於字尾的最大長度。
//如「ababcd」,字元』c』的next陣列對應的值大小為2.
void findnext(int next, string partstr)
if(tmpback == i)
} }
} 在這裡引申一下,前幾天在一家國內著名網際網路公司的筆試中出現了一道次方法的變種,如果不匹配,則要找到最大可匹配的長度,在這裡只簡單說下思想,比如模式串為「abcde」,如果沒有完全匹配的,可記下最大匹配長度,注意這裡是從首字元開始匹配的,也就是任意長度可匹配的字串均從首字元開始,如最大為3,則是「abc」;然後模式串變為「bcde」,此時還需要重新算next陣列,再次匹配,也是從首字元開始匹配的,也就是任意長度可匹配的字串均從首字元開始,如最大為3,則是「bcd」;依次下去,找到最大的可匹配長度。
3、下面介紹一種更高效的演算法:sunday演算法。sunday演算法是daniel m.sunday於2023年提出的字串模式匹配。其核心思想是:在匹配過程中,模式串發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率。
如匹配串「stay student studying」、模式串「study」,如下圖,第乙個第二個匹配,第三個不匹配,那麼匹配串中哪個字元一定會在下次匹配中出現呢,是模式串末尾』y』對應』s』後面的』t』,此時我們需要尋找』t』在模式串中是否出現,結果模式串中存在』t』,相匹配。
stay student studying
study
我們發現在最後乙個字元不匹配,e-y不匹配,此時需要找』n』是否在study出現,結果沒有,繼續往後,』t』出現了,相匹配。
stay student studying
study
我們發現首字元不匹配,s-n不匹配,此時需要找』d』是否出現在模式串中,找到了。
stay student studying
study
將』d』對齊,我們此時便找到了匹配的字串,是不是很快。
stay student studying
study
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...
字串匹配演算法
平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...