樸素的字串匹配演算法

2021-06-08 10:56:39 字數 2040 閱讀 7686

乙個字串是乙個定義在有限字母表∑上的字串行。例如,abcdabc是字母表∑ = 上的乙個字串。字串匹配問題就是在乙個大的字串t中搜尋某個字串p的所有出現位置。其中,t稱為文字(或稱主串,模式串),p稱為模式(或稱子串),t和p都定義在同乙個字母表∑上。

設文字為長度為n,用字元陣列t[1..n]表示,模式串長度為m,m<=n,用字元陣列p[1..m] 表示。

如果t[s+1..s+m] = p[1..m](即對1<=j<=m,有t[s+j]=p[j]),則說模式p在文字t中出現且位移為s。主串中共含有n-m+1個長度為m的子串,顯然有0<=s<=n-m。如果模式p在文字t中出現並且位移為s,則稱s是乙個有效位移,否則稱s為無效位移。所以字串匹配問題就變成了在一段指定的文字t中,查詢模式p出現的所有有效位移問題。

演算法思想:把文字t中的n-m+1個模式分別和模式p進行比較,也就是說對位移s的n-m+1個可能的取值,依次比較兩個子串,如果匹配,則s為乙個有效位移,輸出s。

演算法偽**:

native-string-matcher(t,p)

演算法分析:

從偽**可知,比較兩個長度為m的子串,複雜度為o(m),而外層迴圈n-m+1次,所以本演算法的執行時間o((n-m+1)m)

乙個簡單的c++實現如下:

void native_string_matcher(const char* t, const char* p)

{ int n = strlen(t);

int m = strlen(p);

for(int s=0; s<=n-m; s++)

{ if(strncmp(t+s,p,m) == 0)//比較m個字元

{ cout<<"pattern occurs with shift"<

另乙個簡單c++實現如下:

/*description:在文字t中,從下標pos處開始查詢模式p

return:若找到,則返回第一次匹配的(首字元)下標位置 ,否則返回-1;

*/int index(const char* t, const char* p, int pos)

{ int n = strlen(t);

int m = strlen(p);

int i = pos;

int j= 0;

while(i

這個實現可能不如第乙個實現那麼清晰,但是本質上是一樣的。該程式初始化i=pos,j=0,然後開始逐一比較對應字元值,若相等則指標i和j都向後移動,若不相等則指標回溯。i=i-j+1;也就是把本次掃瞄前指標i的位置(通過此時i的值減去移動的值j求得)向後移動一位,相當於把模式向右移一位。

迴圈結束時可能有兩種情況:(1)j==m,也就是說找到了第乙個匹配的子串,我們返回下標值就可以。(2)i==n且j!=m,也就是說查詢完了文字,但是沒有找到匹配的子串,出現此種情況是因為當位移s> n-m的時候,文字中剩餘的子串長度不足m。

測試程式如下:

#include #include #include using namespace std;

int main(int argc, char *argv)

{ const int max_length = 1000;

char t[max_length];

char p[max_length];

while(gets(t))

{ gets(p);

//native_string_matcher(t,p);

//cout<<"next case:"《注:

(1)所有程式都是在dev-c++上測試通過的,除非特別說明。

(2)由於使用的是c的字元輸入函式gets(),輸入時文字和模式應該以回車符作為分隔。

樸素字串匹配演算法

include include include define maxsize 40 define ok 1 define error 0 using namespace std typedef char string maxsize 1 int string assign string m,char...

演算法 樸素字串匹配

模式匹配是資料結構中字串的一種基本運算,給定乙個子串,要求在某個字串中找出與該子串相同的所有子串,這就是模式匹配。假設p是給定的子串,t是待查詢的字串,要求從t中找出與p相同的所有子串,這個問題成為模式匹配問題。p稱為模式,t稱為目標。如果t中存在乙個或多個模式為p的子串,就給出該子串在t中的位置,...

字串匹配演算法 樸素(暴力)匹配演算法的實現

字串匹配問題 假設存在原始的字串 abcabdfhfd 之後使用 r 表示,現提供另乙個匹配字串 abdf 之後使用 m 表示,請計算得出 m 字串在 r 字串中的位置 問題分析 按照常規的思維,要計算兩個字串的匹配關係,需要使用較短的匹配字串逐項對比原始字串,如果發現有字串不匹配則回到初始位置的後...