字串匹配演算法 BF及KMP

2021-08-28 08:34:13 字數 1067 閱讀 7176

以 absababcef 與 abce 為例,求串2與串1匹配的第乙個位置的下標(這裡即輸出 5),一般的,我們可以從串1的起始位置開始與串2比較,若相同則兩串都向後移,否則,串1回到第二個位置,串2回到起始位置重新比較。

本題用此方法會超時

#includeint a[10001],b[10001];

int main()

{ int t;

scanf("%d",&t);

while(t--)

{int m,n;

scanf("%d%d",&n,&m);

for(int i=0;i從上面一般演算法中我們可以看到兩字串需要不斷地回溯,這會導致複雜度增加,複雜度為o(m*n),再m,n過大的情況下會超時,因此有了kmp演算法。

圖1 從上圖中可以看出我們不必讓串1回溯,串2也不必每次都回溯到起始位置,那麼我們怎麼判斷讓串2回溯到什麼位置你呢?這裡引入字串字首和字尾的最長匹配長度,用pmt陣列儲存,為了方便我們再使用next陣列。

圖2.如圖一所示,比較至8的位置開始不相同,那麼8之前的7個元素都是相同的,那麼由前圖2可知長度為7的字串的字首和字尾的最長匹配長度為3,所以我們可以知道串2只需要回退到pmt[7-1]的位置,即next[7]的位置,所以我們用此方法來解決這道題。

#includeint a[1000001],b[10001],next[100001]; //求next陣列

void getnext(int m)

{ int i=0,j=-1;

next[0]=-1;

while(i

BF演算法與KMP演算法 字串匹配演算法

bf演算法,簡稱暴力破解 bruce force 又稱樸素模式的匹配演算法。可以看出bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和t的第二個字元 若不相等,則比較s的第二個字元和t的第乙個字元,依次比較,直到得出最後的匹配結果。這種演算法...

BF和KMP字串匹配

暴力匹配 bf 演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和t的第二個字元 若不相等,則比較s的第二個字元和t的第乙個字元,依次比較,直到得出最後的匹配結果。package com.yc.algorithm...

字串模式匹配(BF演算法和KMP演算法)

字串模式匹配 在主串s中尋找子串t,若主串第i個下標開始的字串同子串t完全相同,則返回下標i,若遍歷完主串s未找到匹配,則返回 1。bf brute force 演算法 bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元 若不...