BF和KMP字串匹配

2021-09-25 14:35:39 字數 1528 閱讀 7896

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

package com.yc.algorithm.string;

/** * bf模式匹配演算法

* @author yc

*/public class bruteforce else

}private static int bf(string str, string target) else

}if (j >= tars.length) else }}

輸出如下:

缺點: 

1.當第乙個字元不相同時j也會繼續向後比較,比如例子中的「abcdefg」和「def」,當「a」和「d」不相同時,則明顯之後的兩個字元及時相等也不是相同的子串。 

2.每次j下標都要回到0號下標,當主串和字串匹配失敗時,主串進行回溯會影響效率,回溯之後,主串與字串有些部分比較是沒有必要的 

綜上: 這種簡單的丟棄前面的匹配資訊的演算法,造成了極大的浪費和底下的匹配效率。

由此產生了kmp演算法,在前邊基礎上,增加了乙個next陣列,該陣列裡邊存放的是j應該返回的位置,而不是讓j每次都回溯都下標為0的位置。

這個next陣列演算法,說起來比較複雜,就是求最長字首與最長字尾。這個步驟建議一定要自己跟蹤一下,不然很難明白!!!

package com.yc.algorithm.string;

/** * kmp

* @author yc

*/public class kmp else

}private static int kmp(string str, string tars) else

}if (j >= ctars.length) else

}/**

* chars a b c a b c a b d c a b

* i 0 1 2 3 4 5 6 7 8 9 10 11

* next -1 0 0 0 1 2 3 4 5 0 0 1

** j -1 0 0 0 1 2 3 4 5 0 0 1

* @param chars

* @return

*/private static int getnext(char chars) else

} else

}return next;}}

輸出和bf演算法一樣,但效率提高了很多。

字串 字串的模式匹配 BF和KMP

定義在字串中尋找子串 第乙個字元 在串中的位置 相關在串的模式匹配中,子串稱為模式,主串稱為目標 執行時間為o n m 1 初始時讓目標t的第 0 位與模式p的第 0 位對齊 2 順序比對目標t與模式p中的對應字元 1 若 p 與 t 比對發現對應位不匹配,則本趟失配。將 p 右移一位與 t 對齊,...

字串匹配演算法 BF及KMP

以 absababcef 與 abce 為例,求串2與串1匹配的第乙個位置的下標 這裡即輸出 5 一般的,我們可以從串1的起始位置開始與串2比較,若相同則兩串都向後移,否則,串1回到第二個位置,串2回到起始位置重新比較。本題用此方法會超時 includeint a 10001 b 10001 int...

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

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