資料結構之串的模式匹配(C語言實現)

2021-08-07 13:08:50 字數 1757 閱讀 4067

一、暴力匹配演算法(bf)

bf全稱為brute-force,最簡單直觀的模式匹配演算法。

1.演算法思想

兩個字串進行匹配時,乙個主串和乙個模式串,就是按照我們最容易想到的演算法來進行匹配。用兩個變數i,j分別記錄主串和模式串的匹配位置,如果兩者在某個字元不匹配,則將記錄主串匹配位置的變數i回退到匹配前i的位置的後乙個位置,將j回頭到模式串的第乙個字元位置;如果i和j指向的主串和模式串字元匹配,則將兩者同時向後走乙個位置,繼續比較;最後,如果j的位置已經走過了模式串的所有字元,則說明此時匹配成功。

這個演算法很簡單,也容易理解,下面直接給出**。

2.**實現

#include

#include

int bf(const

char *mainstr, const

char *patternstr)

else

}if (j >= ipatlen) //條件滿足說明j走過了模式串的所有字元

return -1;

}int main(void)

二、kmp演算法

kmp演算法的高明之處在於當主串和模式串在某個字元不匹配時,指示主串匹配位置的變數不需要回退,而直接回退指示模式串匹配位置的變數,而且該變數回退時也不需要像bf演算法中回退到起始位置,而是基於原來已匹配過的結果來回退。

關於kmp演算法推導的過程很多部落格中都有,而且很多書上也講的很清楚,大家可以參考嚴奶奶的《資料結構》,裡面有很清楚的推導,我就不寫推導過程了。

下面就我在理解kmp演算法中遇到的問題加以說明,並給出kmp演算法的實現**。

問題1.next陣列的本質

找到匹配成功部分的兩個盡可能長的相等的真子串,乙個子串以0下標開始,另乙個真子串以j-1下標結尾。(這裡的j表示模式串的第j個位置,從0開始計數)

問題2.next[j]=k的含義

next [j] = k,代表j 之前的字串中有最大長度為k 的相同字首字尾

問題3.解釋next[0]=-1,next[1]=0

假設i指示主串的當前匹配位置,j指示模式串的當前匹配位置。從問題2可以知道next[0]=-1的含義就是當

了。但是我們知道下一次匹配的情況,那就是主串的匹配位置往後走乙個(即i+1位置),繼續和模式串的0號位置匹配,所以此時應該將模式串的匹配位置也向後走乙個(即從-1加1為0,從0號位置開始匹配,便於寫**)。

同理next[1]=0,這個更容易理解,它表示的含義是當模式串的1號位置和主串不匹配時,模式串應該回退到0號位置進行匹配,這是理所當然的做法,也是退到無路可退。

問題4.解釋if(j==-1 || sub[j] ==s[i])中j==-1這個條件

當j為-1時,說明此時模式串的第乙個字元和主串不匹配,此時模式串第乙個字元應該和主串的下乙個字元繼續比較,即應該要sub[0]和s[i+1]比較,這兩種狀態切換也是i++和j++的乙個過程,所以可以將兩者合在一起來寫。

**實現

#include

#include

#include

void getnext(const

char *patternstr, int *next)

else

}}int kmp(const

char *mainstr, const

char *patternstr)

else

}if (j >= ipatlen)

return -1;

}int main(void)

資料結構 串的模式匹配演算法 C語言

1 思路 從主串s s0s1s2s3 sn 1 的第乙個字元開始與子串t t0t1t2 tm 1 的第個字元進行比較,若相等,則繼續比較後續字元 否則從主串s的第 個字元開始重新與子串t的第乙個字元進行比較,若相等,則繼續比較後續字元 否則從主串s的第三個字元開始重新與子串t的第乙個字元進行比較 如...

C語言資料結構中串的模式匹配

c語言資料結構中串的模式匹配 串的模式匹配問題 樸素演算法與kmp演算法 include include int index char s,char t,int pos else if j t 0 return i t 0 else return 0 int get next char t,int ...

樸素的串模式匹配(C語言實現) 串模式匹配

從主串 s 的第 pos 個字元起和模式 t 的第乙個字元比較之,若相同,則繼續比較後續字元 否則從主串 s 的下乙個字元起再重新和模式 t 的字元比較之。例 s jinanshi t nan 當採用定長順序儲存結構時,實現此操作的演算法如下 int index sstring s,sstring ...