資料結構之串的匹配

2022-09-16 09:54:13 字數 2494 閱讀 6819

串的匹配應用十分廣泛,比如搜尋引擎、拼寫檢查、語言翻譯、資料壓縮等等,都需要進行串的匹配。

串的模式匹配設有兩個字串 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 #include

4#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 比較兩指標所指的字元。如果相同,兩指標都移動一位。...