串模式匹配之BF和KMP演算法

2021-12-30 04:03:51 字數 1364 閱讀 1236

本文簡要談一下串的模式匹配。主要闡述bf演算法和kmp演算法。力求講的清楚又簡潔。

一 bf演算法

核心思想是:對於主串s和模式串t,長度令為len1,len2, 依次遍歷主串s,即第一次從位置0開始len2個字元是否與t對應的字元相等,如果完全相等,匹配成功;否則,從下個位置1開始,再次比較從1開始len2個字元是否與t對應的字元相等。。。。

bf演算法思路清晰簡單,但是每次匹配不成功時都要回溯。

下面直接貼**:

int bf_match(char *s, char *t)

二 kmp演算法

它是一種改進的bf演算法。主要消除了主串指標i的回溯,利用已經得到的部分匹配結果將模式串盡可能遠的右滑再繼續比較。使演算法的時間複雜度有bf的o(len1*len2)變為o(len1+len2).在kmp演算法中,串指標i不回溯,由模式串指標j退到某乙個位置k上,使模式串t中的k之前的k-1個字元與s中的i之前的k-1個字元相等,這樣可以減少匹配的次數

從而提高效率。

當是s[i]!=t[j] 表示主串s的第是s[i-j+1]----->s[i]元素 與模式串t[0]----->t[j-1]元素對應相等;這時為了盡可能右移指標,應該從主串的i-j+1到i-1個子串當中由最後乙個往前尋找到

乙個最大子串完全匹配。也相當於在模式串的t[0]----->t[j-1]元素中尋找k最大值使前k個元素 與後k個元素對應相等。

下面用next陣列儲存每次比較時,模式串開始的位置。

下面以主串」ababcacabcabbab「和模式串」abcab「為例進行說明

開始時,從第乙個元素開始比較,如果t所有元素都匹配到,匹配成功。否則,s[i] != t[j],如果j==0 下一次比較位置 next[j]=-1,即從t[0]開始和s[i+1]比較。

如果k=next[j]不等於0,屬於case1 則下一次比較,從t[k]與s[i]開始;如果k=0,case2,下次比較時直接從t[0]與s[i]比較 沒有優化。

總之,比較過程中s的指標i一直在增加。模式串指標j可以根據上一次部分匹配結果優化。

下面直接貼**:

//kmp演算法,利用部分匹配結果將模式串右移盡可能遠,減少比較次數

//getnext用來儲存每次比較模式串開始的位置

模式匹配之BF演算法和KMP演算法

兩種演算法主要差別就是指標回溯的位置,kmp演算法去除了bf演算法中很多重複的比較 define crt secure no warnings include include include 使用陣列下標的方式比較,如果找到返回子串在主串中的位置,沒找到返回 1 intbf const char s...

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

子串的定位操作通常稱作串的模式匹配,關於串的模式匹配演算法主要介紹兩種 1.brute force簡稱為bf演算法,也稱簡單匹配演算法,在給出的字串中尋找和需要匹配的字串相同的部分,為了簡潔就稱給出的長字串為目標串,需要匹配的字串為模式串。用bf演算法進行匹配的時候,同時從目標串和模式串開始,如果第...

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

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