更高效的字串匹配演算法 shift and

2021-08-21 13:38:47 字數 1209 閱讀 9211

在接觸這個演算法之前,一直覺得kmp巧奪天工,利用next陣列的遞推,實現對於模式串任一子串最大相同前字尾的找尋,繼而在匹配目標串的過程中,一旦遇到失配情況,可以令 匹配起始下標 進行合理範圍內最大的跳躍,從而將匹配整體複雜度從o(nm)降為o(m+n)。

a b c a bc........

a b c a bk可從目標串第二個 a 處開始匹配

演算法大致思路:

1.根據模式串每位的字元建立字元表,如 a 對應的(bitset<5>)"00101",表示在模式串的1,3位上可以是字元a。

2.初始化儲存結果的bitset物件 d 為"00000",表示沒有乙個字元成功匹配,(即沒有乙個字元既是完整模式串的字首,又是當前目標串的字尾,通俗來講就是,失配後起始位要老老實實挪到下一位,跳不成)。之後則不斷從目標串中讀入字元,並套用公式

d=(d<<1|1)&b[s[i]];

表示將原結果左移一位,將[1]位置為1,表示對於新的一位匹配的期望,如果b[s[i]]第一位剛好也為1,則d串中即可更新。

該&操作的意義是:(d<<1|1)試圖將所有匹配位均向左增加一位,如果新加入的字元模式串中該位出現過,則匹配串公升級成功。

3.時刻檢查,如果d中n位為1,則證明出現一組匹配結果。

下面展示樣題:

2016 大連icpc b

數字串匹配,模式串(長度小於1000)中的每個位上,均有若干個可選項,給定乙個較長的目標串(長度小於5*1e6),輸出所有匹配結果。

#include#include#include#includeusing namespace std;

bitset<1001> b[10],ans;

char s[5000005];

int n,len;

int main()

{ cin>>n;

char ch;

for(int i=1; i<=n; i++)

{int m;

scanf("%d",&m);

for(int j=0; j壓著超時的線通過,通過這道題發現直接用puts比乙個乙個putchar快不少。

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

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

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...