在源字串中查詢目標串的位置,要求:
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 直觀演算法很簡單,如果字串中當個字元匹配,主串指標...