字串模式匹配演算法小結

2021-07-30 11:50:05 字數 2627 閱讀 5829

參考文章:july 的從頭到尾徹底理解kmp

字串模式匹配:在乙個文字(長字串)中找出乙個或多個指定的字串(pattern),並返回其位置。

下面介紹幾種字串模式匹配演算法:brute-force演算法、kmp演算法、bm演算法、sunday演算法

文字字串s,索引 i ,模式字串p,索引 j

字串匹配演算法之bf演算法:

基本思路:假設文字串s比較到i位置,模式串p比較到j位置。

如果當前字元匹配成功(s[i] == p[j]),那麼繼續向下比較,i ++,j++。

如果當前字元匹配失敗(s[i] != p[j]),那麼將文字串的索引 i ,回溯到 i - j +1位置(回到模式串開頭對應的文字串的位置的下乙個位置,就是將模式串相對於文字串右移1位),然後 模式串的索引 歸0,即:i = i - j +1;j=0。

如果文字串的長度為n,模式串的長度為m,那麼bf的時間複雜度為o(m *n)。

**:

/*

* bf演算法:暴力匹配

* */

public static int bfsearch(string s,string p)

/*** bf演算法的具體實現:

* * @param s 文字串

* @param p 模式串

* @return 如果搜尋成功,返回p在s中的索引,否則返回 -1;

*/private static int bfsearch(char s, char p)

/** * kmp演算法具體實現

* @param s 文字串

* @param p 模式串

* @return

*/ private static int kmpsearch(char s, char p) else

}else

} return next;

}

關於字串的字首字尾最長公共序列的長度與next 陣列的關係:

假設模式字串為: p0,p1,p2,。。。,pj-1,pj

(1)字串的字首字尾最長公共序列的長度:

對於上述模式字串,若存在p0,p1,p2 ...pk-1,pk = pj-k,pj-k+1,....,pj-1,pj,那麼在包含pj 的模式字串p有最大長度為k+1的相同字首字尾。

(2)求next 陣列

next[ j] = k,表示的當前模式串p中p[j]之前的字串(即p0 ....pj-1)有最大長度為k 的字首字尾公共序列。

所以:將(1)中求的數值整體後移一位,就是對應的next陣列的值,並規定next[0] = -1.

如果文字串的長度為n,模式串的長度為m,那麼匹配過程的時間複雜度為o(n),算上計算next的o(m)時間,kmp的整體時間複雜度為o(m + n)。

字串匹配演算法之bm演算法:

kmp演算法的匹配是從模式串的開頭就開始匹配的,bm演算法是從模式串的尾部開始匹配的,最壞時間複雜度為o(n),

在實踐中,比kmp演算法的效率高。

bm演算法中有兩個規則:

壞字元規則:當文字串中的某個字元與模式串中 的某個字元不匹配時,文字中的該字元就稱為壞字元。此時模式串需要向右移動,移動的位數 = 壞字元在模式串中的位置 - 壞字元在模式串中最右出現的位置。此外,如果"壞字元"不包含在模式串之中,則最右出現位置為-1。

好字尾規則:當字元失配時,後移位數 = 好字尾在模式串中的位置 - 好字尾在模式串上一次出現的位置,且如果好字尾在模式串中沒有再次出現,則為-1。

字串匹配演算法之sunday演算法

sunday 演算法何bm演算法很相似,bm演算法是從後往前匹配,sunday演算法是從前往後匹配,並且失配的時候關注的是文字串中參加匹配的最末尾的字元的下一位字元。

如果該字元沒有在模式串中出現,則直接跳過,即移動的位數 = 匹配串的長度+1;

否則,其

移動的位數 = 模式

串中最右端的該字元到末尾的距離 +1.

舉例:文字串:

substring searching algorithm

模式串: search

(1)開始時,把模式串與文字串對其,從文字串的開頭進行匹配,匹配第乙個字元s,s匹配成功,繼續下乙個

substring searching algorithm

search

(2)第二個字元 u,與e 不匹配,失配時關注的是文字串中參與匹配的最末尾字元的下一位字元,即i  ,查詢i 在模式串中最靠右的位置,模式串中沒有i,那麼模式串要移動的位數 =  模式串的長度 +1 = 6 +1 = 7;所以模式串右移7位,移動到 與 i 的下一位 n 對其的位置。

substring searching algorithm

search

substring searching algorithm

search

,所以模式串要右移的位數 =

模式串中最右端的該字元到末尾的距離 +1

=  2 +1 = 3.是兩個r對其。

substring searching algorithm s

earch

(4)匹配成功。 de

字串模式匹配演算法

題目 給定兩個字串s和t,判斷t是否在s中出現 思路如下 引用 採用最簡單的匹配方法 在串s abcabcabdabba 中查詢t abcabd 我們可以假設從下標0開始 先是比較s 0 和t 0 是否相等,然後比較s 1 和t 1 是否相等 我們發現一直比較到s 5 和t 5 才不等。如圖 當這樣...

字串模式匹配KMP演算法

next的值去改變每次匹配的位置 注意 字串的儲存最好用字元陣列,然後用字元輸入的形式,保證正確!利用求模式串的next值來分析遍歷,可以在不改變主串i的值的基礎上,只改變next j 的下標來遍歷 next j include include using namespace std void ge...

字串模式匹配KMP演算法

字串模式匹配指的是,找出特定的模式串在乙個較長的字串中出現的位置。很直觀的可以寫出下面的 來找出模式串在乙個長字串中出現的位置。1 2 樸素的模式匹配演算法 3 功能 字串的模式匹配 4 引數 5 s 目標串 6 p 模式串 7 pos 開發匹配的位置 8 返回值 9 匹配成功,返回模式串在目標串的...