子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文字處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位:
int index(const string &tag,const string &ptn,int pos)
其中,tag為主串,ptn為子串(模式串),如果在主串tag的第pos個位置後存在與子串ptn相同的子串,返回它在主串tag中第pos個字元後第一次出現的位置,否則返回-1。
我們先來看bf演算法(brute-force,最基本的字串匹配演算法),bf演算法的實現思想很簡單:我們可以定義兩個索引值i和j,分別指示主串tag和子串ptn當前正待比較的字元位置,從主串tag的第pos個字元起和子串ptn的第乙個字元比較,若相等,則繼續逐個比較後續字元,否則從主串tag的下乙個字元起再重新和子串ptn的字元進行比較,重複執行,直到子串ptn中的每個字元依次和主串tag中的乙個連續字串相等,則匹配成功,函式返回該連續字串的第乙個字元在主串tag中的位置,否則匹配不成功,函式返回-1。
用c++**實現如下:
[cpp]view plain
copy
?/*返回子串ptn在主串tag的第pos個字元後(含第pos個位置)第一次出現的位置,若不存在,則返回-1
採用bf演算法,這裡的位置全部以從0開始計算為準,其中t非空,0<=pos<=tlen
*/int
index(
const
string &tag,
const
string &ptn,
intpos)
else
//如果當前字元不同,則i和j回退,重新進行匹配
} if(j >= plen)
return
i - plen;
else
return
-1;
}
呼叫上面的函式,採用如下**測試:
[cpp]view plain
copy
?intmain()
while
(ch ==
'y'|| ch ==
'y');
return
0;
}
測試結果如下:
以上演算法完全可以實現要求的功能 ,而且在字元重複概率不大的情況下,時間複雜度也不是很大,一般為o(plen+tlen)。但是一旦出現如下情況,時間複雜度便會很高,如:子串為「111111110」,而主串為 「111111111111111111111111110」 ,由於子串的前8個字元全部為『1』,而主串的的前面一大堆字元也都為1,這樣每輪比較都在子串的最後乙個字元處出現不等,因此每輪比較都是在子串的最後乙個字元進行匹配前
串的模式匹配
最近在學 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 直觀演算法很簡單,如果字串中當個字元匹配,主串指標...