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

2021-09-27 20:48:27 字數 1659 閱讀 4050

定義在字串中尋找子串(第乙個字元)在串中的位置

相關在串的模式匹配中,子串稱為模式,主串稱為目標

執行時間為o(n*m)

1、初始時讓目標t的第 0 位與模式p的第 0 位對齊;

2、順序比對目標t與模式p中的對應字元:

(1)若 p 與 t 比對發現對應位不匹配,則本趟失配。將 p 右移一位與 t 對齊,進行下一趟比對;

(2)若 p 與 t 對應位都相等,則匹配成功,返回 t當前比較指標停留位置減去 p 的長度,即目標t 中匹配成功的位置,演算法結束。

(3)若 p 與 t 比對過程中,t 後面所剩字元個數少於 p 的長度,則模式匹配失敗。

int find(hstirng&t,hstring&p)

return -1; //匹配失敗

}

低效的原因在於每趟重新比較時,目標 t 的檢測指標要回退。

若一趟匹配過程比對失配,在做下一趟匹配比對時,目標 t 的檢測指標不回退,模式 p 右移(k),與 t 的檢測指標對齊,再開始比對過程

字元的比較次數最多為 o(n),n 是目標 t 的長度。

圖示如下:

對於不同的 j(p 中的失配位置),k 的取值不同,它僅依賴於模式 p 本身前 j 個字元的構成,與目標無關。k值實際是j位前的子串的最大重複子串的長度。

可以用乙個 next [ ] 失配函式來儲存:當模式 p 中第 j 個字元與目標 t 中相應字元失配時,模式 p 中應當由哪個字元(設為第k+1個)與目標中剛失配的字元重新繼續進行比較。next[j] = k

next 失配函式從0, 1, 2, …, m-1逐項遞推計算:

1、當 j = 0時,n0 = -1。設 j > 0 時 nj-1 = k:

2、當 k = -1或 j > 0且 pj-1 = pk,則 nj = k+1。

3、當 pj-1 ≠ pk 且 k ≠ -1,令 k = nk,並讓3迴圈直到條件不滿足。

4、當 pj-1 ≠pk 且 k = -1,則 nj = 0。

void getnext ( hstring& p, int next ) 

};

void getnext ( hstring& p, int next ) 

}; int fastfind ( hstring& t, hstring& p, int next[ ] )

//對應字元匹配,比對位置加一

else

j = next[j]; //第 j 位失配,找下一對齊位置

} if ( j < p.n )

return -1; //j 未比完失配,匹配失敗

else

return i-p.n; //匹配成功

}

字串的模式匹配 BF演算法

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

BF和KMP字串匹配

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

字串匹配演算法 BF

brute force演算法,簡稱bf演算法,是一種簡單樸素的模式匹配演算法,常用語在乙個主串string內查詢乙個子串 pattern的出現位置。核心思想 i遍歷主串string i 每自增一次,內層迴圈用j遍歷子串pattern,同時判斷patter j string i j 若條件成立,j 自...