串的匹配應用十分廣泛,比如搜尋引擎、拼寫檢查、語言翻譯、資料壓縮等等,都需要進行串的匹配。
串的模式匹配設有兩個字串 s 和 t ,設 s 為主串(正文串),t 為子串(模式),在主串 s 中查詢與模式 t 相匹配的子串,如果匹配成功,確定相匹配的子串中第乙個字元在主串 s **現位置。下面介紹兩種演算法:bf 演算法和 kmp 演算法。
1、分別利用計數指標 i 和 j 指示主串 s 和 模式 t 中當前待比較的字元位置。
2、如果比較未到結尾,則迴圈執行以下操作:
① s.ch[ i ] 和 t.ch[ j ] 比較,若相等,則 i++; j++; 繼續比較後續字元。
② 若不等,指標後退重新匹配,從主串的下乙個字元(i = i - j + 2)起再重新和模式的第乙個字元(j = 1)比較。
3、如果 j > t.length,說明匹配成功,返回和模式 t 第乙個字元相等的字元在主串中的序號(i - t.length),否則失敗,返回0。
該演算法的時間複雜度為o(m × n)
**如下:
1 #include2 #include3 #include效果如下:4#define maxsize 20
5 typedef struct
6 string;
10int
index_bf(string s, string t);
11int
main()
1229
int index_bf(string s, string t) //
bf演算法
30 //
繼續向後匹配字元
35else //
若不相等,回溯36}
37if (j >t.length)
38return i -t.length;
39else
40return0;
41 }
此演算法的改進在於,每當每當匹配過程**現字元比較不相等時,不需要回溯 i 指標,而是利用已經得到的 「部分匹配」 的結果將模式向右 「滑動」 盡可能遠的一段距離,繼續進行比較。而滑動的具體距離,由 get_next 函式確定,具體原理不再描述。
時間複雜度為o(m + n),較bf演算法有很大提公升。
1 #include2 #include3 #include4#define maxsize 20
5 typedef struct
6 string;
10int index_kmp(string s, string t, int
next);
11void get_next(string t, int
next);
12int
main()13;
16string s, t;
17 printf("
請輸入主串s:");
18 gets(s.ch + 1
);19 s.length = strlen(s.ch + 1
);20 s.ch[0] = (char
)s.length;
21 printf("
請輸入模式串t:");
22 gets(t.ch + 1
);23 t.length = strlen(t.ch + 1
);24 t.ch[0] = (char
)t.length;
25get_next(t, next);
26 flag =index_kmp(s, t, next);
27if
(flag)
28 printf("
匹配成功,在第%d位。\n
", flag);
29else
30 printf("
匹配失敗,未找到該子串。\n");
31}32void get_next(string t, int
next)
3339
else j =next[j];40}
41}42int index_kmp(string s, string t, int
next)
4348
else j =next[j];49}
50if (j >t.length)
51return i -t.length;
52else
53return0;
54 }
效果如下:以上就是兩種最常用的串匹配演算法
資料結構之字串的模式匹配
字串的模式匹配問題 一共有兩種演算法,1.樸素模式匹配演算法。舉例而言 尋找從s goodgoogle 中找到v google 這個子串 我們一般需要以下的步驟 1 從主串的第乙個字元開始,s與 v中的字元逐一比較,可以發現前三個匹配成功而第四個沒有匹配成功 豎線代表成功,折現代表失敗 2 主串的開...
資料結構2 2串的模式匹配
子串在主串中的定位操作稱為串的模式匹配,記為index s,t,pos 即在主串s中,從第pos個字元開始查詢與子串t第一次相等的位置。若查詢成功,則返回子串t的第乙個字元在主串中的位序,否則返回0。其中主串稱為目標串,子串稱為模式串。基本思想 從目標串的第pos個字元開始與模式串的第乙個字元比較,...
資料結構04 串的樸素匹配
在串的問題裡,匹配是很重要的一類問題。匹配是在乙個給定的主串中尋找乙個相同的子串,確定子串出現的位置。乙個樸素的做法是,將主串和子串逐字元比較。用指標移動兩字元。步驟如下 1 有兩指標,其中乙個i指向主串查詢的位置,另外j乙個指標指向子串的首位。2 比較兩指標所指的字元。如果相同,兩指標都移動一位。...