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

2021-07-13 09:01:16 字數 1521 閱讀 7997

部落格源址:

相信大家對快捷鍵ctrl+f是做什麼用的都應該很熟悉了,無論是文字編輯、網頁瀏覽等程式上它都意味著字串搜尋,我們提供乙個關鍵字,它將找到當前頁面上的所有該關鍵字所在的位置。關鍵字稱為模式串,在文字t中尋找模式串p出現的所有出現的位置,解決這種問題的演算法叫做字串匹配演算法。字串匹配演算法可以說是電腦科學中最古老、研究最廣泛的問題之一,並且字串匹配的應用也隨處可見,特別是資訊檢索領域和計算生物學領域。

字串匹配演算法有很多很多,多到可以出一本書了《柔性字串匹配》...感興趣的同學可以查閱一下這本書。

其中最著名可算是knuth-morris-pratt(kmp)演算法和boyer-moore(bm)演算法,因為這兩個經典演算法都將匹配演算法的時間複雜度的理論值從o(m*n)降到了線性的o(m+n),由此促使我好好研究了一下。除了經典演算法,簡潔但不失效率的較新的horspool演算法和sunday演算法也是我不可錯過的。接下來先從最最最簡單的樸素匹配演算法開始講起吧:

( 注:文中的演算法程式,輸入文字t、模式串p,列印出p在t中的所有位置起點。)

1、樸素匹配演算法

儘管很多資料上將最簡單的匹配演算法成為暴力匹配,但我仍然喜歡演算法導論上的叫法,樸素的匹配演算法。

文字t長度為m,模式串p長度為n。演算法從文字第1位從左向右開始與模式串p進行匹配,無論是否匹配成功,模式串都後移1位開始繼續進行重新匹配,總共進行m-n+1次匹配。演算法極其簡單,因此效率極其有限,時間複雜度為o(m * n),故不常被用。

圖例:第一步:

第二步:(模式串後移1位)

第三步、第四步...

**實現:

// 1.樸素的字串匹配演算法  

void *****matcher(const char *t, const char *p)

return kt;

} void kmpmatcher(const char *t, const char *p)

} return suff;

} int* goodsuffix(const char *p)

i = i + st[(int)t[i+n]] + 1;

} cout<6、總結

以上介紹的其實都是單字串匹配演算法,除了介紹的幾種之外此類演算法還有shift-and/shift-or演算法、bndm演算法、bom演算法等;除了這類,還有像multiple shift-and演算法、aho-corasick演算法、set horspool演算法等等多字串匹配的演算法。這個領域水很深那,對於我來說還沒那個必要去研究那麼多,因為暫時用不上,現階段知道幾個簡單高效的價效比高的單字串匹配演算法就ok了,比如horspool和sunday演算法,因為在實際應用中編碼效率和程式執行效率才是王道。

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

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

簡單字串匹配 Brute

很簡單 簡單的 include include include int main else if t j 0 else 模式匹配的brute force演算法 brute force演算法實現模式匹配的思想是 從主串s s0s1 sn 1 的第乙個字元開始和模式串t t0t1 tn 1 的第乙個字元...

簡單字串

給你乙個由 0 9 組成的字串s 1 s 的長度 100 和乙個正整數n 1 n 3 我們將所有的 0 都看成空格。這樣你就得到幾個分隔開來的字串。輸出第n個字串。題目保證分隔開來的字串的數量大於等於n。input 第一行輸入正整數t 1 t 100 代表t組測試資料。對於每一組測試資料由一行組成 ...