定義在字串中尋找子串(第乙個字元)在串中的位置
相關在串的模式匹配中,子串稱為模式,主串稱為目標
執行時間為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 的長度,則模式匹配失敗。
低效的原因在於每趟重新比較時,目標 t 的檢測指標要回退。int find(hstirng&t,hstring&p)
return -1; //匹配失敗
}
若一趟匹配過程比對失配,在做下一趟匹配比對時,目標 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 自...