介紹
串的模式匹配,是求乙個字串在另乙個字串中第pos個字元以後的位置:
int index(sstring s,sstring t,int
pos);
s稱為主串,t稱為模式串。
目錄
1. 簡單的模式匹配
2. 首尾模式匹配
3. kmp演算法
參考資料
1、嚴蔚敏《資料結構(c語言版)》
2、王道考研2023年資料結構考研複習指導
3、教學ppt
一、簡單的模式匹配
稱為樸素演算法(bf演算法):
從主串s指定的字元開始和模式串t的第pos個字元比較,匹配就繼續比較s、t的下乙個字元,如果不匹配,從s的下乙個字元開始,重新與t的第乙個字元比較。如果s中的字元都匹配完了,仍然沒有匹配成功(此時t中字元序號小於或等於t的長度)。把s、t的長度分別儲存在s[0],t[0]中,演算法如下:
int index(ssrting s,sstring t,int
pos)
else
}if(j>t[0])return i-t[0];
else
return
0;}
該演算法的時間複雜度為:o(mn)。m、n分別為t、s的長度。但在一般情況下,樸素的模式匹配演算法的實際執行時間近似o(m+n)。
二、首尾模式匹配
核心思思:先比較模式串中的第乙個字元,再比較模式串中最後乙個字元,如果都相等,比較中間的字元。
**如下:
int index(ssrting s,sstring t,int pos)
if(j==tlength)return i;
else ++i;}}
return
0;}
演算法的時間複雜度o(mn)。
三、改進的模式匹配演算法——kmp演算法
這個演算法琢磨了好久才明白,核心思想是:每當一趟匹配過程中出現字元比較不相等時,不需回溯i指標,而是利用已經得到的「部分匹配」的結果將模式向右「滑動」盡可能遠的一段距離後,繼續比較。
重點在於求next[j]。
next陣列的求解就是對每個位置之前的字元的字首字尾找到最長的公共字串長度。定義是:
next[j]=
1、0——當j=1時
2、max
else j=next[j];
}if(j>t[0])return i-t[0];
else
return0;}
void get_next(sstring t,int next)
else j=next[j];
}}時間複雜度為o(n+m)。
通常,模式串的長度m比主串的長度n要小得多,因此,對整個匹配演算法來說,所增加的這點時間是值得的。
kmp最大的特點/優點是主串指標i不回溯,這對處理從外設輸入的龐大檔案很有效,可以邊讀入邊匹配,無需回頭重讀。
而由於一般情況下,樸素的模式匹配演算法的實際執行時間近似o(m+n),因此至今仍被採用。kmp演算法僅僅是在主串與子串有很多「部分匹配」時才顯得比樸素的演算法快得多。
串的模式匹配
最近在學 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 直觀演算法很簡單,如果字串中當個字元匹配,主串指標...