字串匹配 kmp,bm和sunday演算法

2021-08-07 12:10:59 字數 1240 閱讀 8431

先了解一下kmp的核心,跳轉表:

跳轉表是對於模式字串而言,即你需要在目標字串匹配到的內容。

例如你想在ababdbccbababcd中匹配到baba,那麼baba就是模式字串。

下面介紹跳轉表的實現方法:

跳轉表的匹配是匹配前字尾,匹配目標是永遠從第乙個字元開始的字串的字串,例如baba這個字串:

匹配目標

字首字尾

跳轉值baba

0bab

b,ba

b,ab1

可以看出字首和字尾永遠是從左到右有序的。

跳轉表的使用:

在匹配時:

ababdbccbababcd

baba

無匹配,往後移動一位

ababdbccbababcd

baba

匹配到三個,第四個a無匹配,然後去找含有三個元素子串的對應值,其對應值為1,即向後移(長度-對應值個)單位,即移兩個單位,這個原理是我們運用已匹配的資料,比如例子中的bab,因為我們已經知道了這三個已經匹配到絕對不會全是我們需要的,然後我們通過前面的匹配知道了b是重複元素,那麼我們可以利用後面這個已經匹配的b來加速我們的判斷過程。

bm演算法不僅比kmp簡單,而且具有更高的效率。

bm演算法的核心在於從後向前匹配以及不包含專案的快速跳轉。

還是以kmp中的例子為例介紹bm演算法,我們想在ababdbccbababcd中匹配到baba。

先將兩個字串對其,得:

ababdbccbababcd

baba

從後往前匹配時,我們發現最後乙個就已經不匹配了,我們將其往後移一位,得:

ababdbccbababcd

baba

發現最後乙個仍然不匹配,並且d不在我們的模式串裡,那麼我們可以直接後移乙個模式串的距離。

有了前兩個的基礎,sunday演算法也很好理解

還是以kmp中的例子為例,我們想在ababdbccbababcd中匹配到baba。

先將兩個字串對齊,得:

ababdbccbababcd

baba

從前向後匹配,我們發現並不匹配,然後找不匹配部分的下乙個字元,即d字元,然後發現d不在模式串中,那我們直接往後移動乙個模式串+1的距離,即:

ababdbccbababcd

baba

然後從前向後匹配,發現第二個不匹配,這時候找到不匹配部分的下乙個字元,即a,然後將模式串裡的a和其對齊,注意模式串是從後向前掃瞄的。

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...