串的模式匹配

2021-10-08 02:54:00 字數 2402 閱讀 8955

在源字串中查詢目標串的位置,要求:

1,使用回溯法;

偽**:

輸入:主串s,模式t

輸出:t在s中的位置

1.初始化主串比較的開始位置index=0;

2.在串s和串t中設定比較的起始下標i=0,j=0;

3.重複下述操作,直到s或t的所有字元均比較完畢:

3.1如果s[i]等於t[j],則繼續比較s和t的下一對字元;

3.2否則,下一趟匹配的開始位置index++,回溯下標i=index,j=0;

4.如果t中所有字元均比較完,則返回匹配的開始位置index;否則返回0;

演算法主體:

測試用例:

執行結果:

2,程式實現kmp演算法,在演算法實現過程中說明輔助資料結構next陣列的作用;

偽**:

輸入:主串s,模式t

輸出:t在s中的位置

1.在串s和串t中分別設定比較的起始下標i=0,j=0;

2.重複下述操作,直到s或t的所有字元均比較完畢:

2.1如果s[i]等於t[j],則繼續比較s和t的下一對字元;

2.2否則,將下標j回溯到next[j]位置,即j=next[j];

2.3如果j等於-1,則將下標i和j分別加1,準備下一趟比較;

3.如果t中所有字元均比較完畢,則返回本趟匹配的開始位置;否則返回0;

演算法主體:

測試用例:

執行結果:

next陣列作用:

個人觀點:求next陣列的過程完全可以看成字串匹配的過程,即以模式字串為主字串,以模式字串的字首為目標字串,一旦字串匹配成功,那麼當前的next值就是匹配成功的字串的長度。具體來說,就是從模式字串的第一位(注意,不包括第0位)開始對自身進行匹配運算。 在任一位置,能匹配的最長長度就是當前位置的next值。

3,定性分析回溯法和kmp演算法的時間複雜度;

回溯法:

設主串s長度為n,模式t長度為m,在匹配成功的情況下,考慮最壞情況,即每趟不成功的匹配都發生在模式t的最後乙個字元。

設匹配成功發生在處,則在i-1趟不成功的匹配中共比較了(i-1)×m次,第i趟成功的匹配共比較了m次,所以總共比較了i×m次,因此平均比較次數是:

一般情況下,m<

kmp演算法:

在求得模式t的next值後,kmp演算法只需將主串掃瞄一遍,設主串的長度為n,則kmp演算法的時間複雜性是o(n)。

4,在以上基礎上闡述kmp演算法相對於回溯法的優越性;

回朔法:方法粗暴,因為每次查詢失敗,源串需要回到起始位置的下乙個位置開始查詢,所以該演算法演算法複雜度大,很浪費時間。

kmp演算法:先對要查詢的字串進行分析,找出其中重複的子字串。然後將目標串與源串比較,一旦比較失敗,則不用回朔,而是根據目標串子串的重複情況,直接調到重複子串的下乙個位置。這樣減少了大量的回朔,演算法複雜度大量減小。

5,課堂拓展:求字串s1和s2的最大公共子串。

思路:1.輸入兩個字串,由短字串的長度決定比較次數。

2.每次比較乙個字元,從短字串的第乙個依次與長字串的每乙個字元比較,若出現相同的字元,則兩個字串各自取下一位進行比較,直到出現不相同字元的為止。(同時要注意比較是不能超出短字串的長度,不然會出現未知後果)

3.定義兩個陣列a,b;a用來獲取相同字元,若a的長度大於b的長度,則將a複製給b。

演算法**部分:

主函式測試用例:

執行結果:

串的模式匹配

最近在學 vc include stdafx.h include include define max size 1000 串的模式匹配 功能 找出str2字串在str1字串中第一次出現的位置 不包括串結束符 返回 該位置的序號 環境 visual c 2008 注意 1.此為樸素的模式匹配演算法,...

串的模式匹配

以前每次看到字串匹配,一律跳過,今天耐著性子研究了下,依舊是半混沌狀態,先整理放在這,以備後用。這篇文章幫助很大,樸素匹配演算法 kmp演算法,收藏先。1.樸素匹配演算法 int patternmatch common const char pstring,const char ppattern i...

串的模式匹配

子串的定位操作通常稱作串的模式匹配。index s,t,pos t被稱為模式串。直觀演算法 int index string s,string t,int pos else if j lent return i lent else return 0 直觀演算法很簡單,如果字串中當個字元匹配,主串指標...