模式匹配的Brute Force演算法和KMP演算法

2022-08-27 01:24:11 字數 1438 閱讀 5877

模式匹配

模式匹配的具體含義是在主串s中從start開始查詢乙個與模式串t相同的子串。如果找到則返回模式串t的第乙個字元在主串中的下標;如果未找到則返回-1。

1.模式匹配的brute-force演算法

brute-force演算法實現模式匹配的思想是:從主串s=」s0s1…sn-1」的第乙個字元開始和模式串t=」t0t1…tn-1」的第乙個字元比較,若相等,則繼續比較後續字元;否則從主串s的第二個字元開始重新與模式串t的第乙個字元比較。如此不斷繼續,若存在模式串中的每個字元依次和主串中的乙個連續字串行相等,則匹配成功,返回模式串t的第乙個字元在主串中的下標;否則匹配失敗,返回-1。

int index_bf ( char s [ ], char t [ ], int pos )

當此集合非空時

②next[j]= 0                                         其他情況

③next[j]= -1                                        當 j = 0 時

若模式串t中存在真子串「t0t1…tk-1」 = 「tj-ktj-k+1…tj-1」,且滿足0j與主串s的si比較不相等時,模式串t中需重新和主串s的si比較的字元下標為k,即下一次開始比較si和tk;若模式串t中不存在如上所說的真子串,有next[j] = 0,則下一次開始比較si和t0;當j = 0時,令next[j] = -1,此處-1為一標記,表示下一次開始比較si+1和t0.

簡而言之,kmp演算法對brute-force演算法的改進就是利用已經得到的部分匹配結果將模式串t右滑一段距離再繼續比較,從而無需回退主串s的下標值。

#include #include using namespace std;

void get_nextval(const char *t, int next)

// if

else

k = next[k];

}// while

////這裡是我加的顯示部分

// for(int i=0;i// //cout<}// get_nextval 

int kmp(const char *text,const char* pattern)

int *next=new int[len+1];

get_nextval(pattern,next);//求pattern的next函式值

int index=0,i=0,j=0;

while(text[i]!='\0' && pattern[j]!='\0' )

else

}}//while

delete next;

if(pattern[j]=='\0')

return index;// 匹配成功

else

return -1;

}int main()//abcabcad

字串匹配演算法 Brute Force演算法

brute force 暴力 演算法是字串匹配中最簡單也是最容易理解的演算法。主要思想是 按順序遍歷母串,將每個字元作為匹配的起始字元,判斷是否匹配字串。若第乙個字元與字串匹配,則比較下乙個字元,否則回退到母串與字串比較的第乙個字元的下個字元,繼續比較。brute force演算法的時間複雜度為o ...

模式匹配 關於模式匹配的演算法實現2

參照我上篇部落格,只不過多了乙個識別率的演算法而已,還是參考歸併排序寫的,很簡單。上篇部落格位址 很多的解釋都在 裡面了,各位看看就明白了 author seen time 2015 09 20 include include include using namespace std struct p...

簡單模式匹配演算法 串的模式匹配

一 對乙個串中的某子串的定位操作稱為串的模式匹配 二 模式串 待定位的子串 三 基本思想 從主串中的第乙個位置起和模式串的第乙個字元開始比較 如果相等,則繼續比較後續字元 如果不等,則從主串的第二個字元起,重新用上一步的方法與模式串中的字元作比較 以此類推,直到比較完模式串的所有字元,則匹配成功,返...