子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文字處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位:
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,這樣每輪比較都在子串的最後乙個字元處出現不等,因此每輪比較都是在子串的最後乙個字元進行匹配前
如果在夜暗裡沒有夜梟的鳴叫
這精短文字,一直刻在我的記憶裡,已經成為我隨口而誦與 前後赤壁賦 湖心亭看雪 一樣,珍重的溫慰我心裡的文字 夜幕低垂。就像有時低頭沉思一樣,夜幕緊緊地閉合起來。四周睡的都是人。乙個小小的花招,一種毫無道理的自我欺騙 他們睡在屋子裡,睡在牢固的床上,睡在堅實的屋頂下,或伸或蜷睡在床墊上,睡在床單上,睡...
如果在迴圈中刪除列表中的元素
我們在在討論這個問題之前,先考慮以下 的輸出結果 arraylist list newarraylist arrays.aslist a b c d for int i 0 isize i system.out.println list 輸出結果 b,d 以上 的目的是想遍歷刪除list中所有元素,...
如果在chrome的新標籤中繼續開啟開發工具
之前我除錯抓包用chrome的fiddler外掛程式,是因為它能抓取chrome頁面中所有的標籤包資訊,而chrome自帶的開發工具不會從新標籤中預設開啟開發工具,這就是我有時候會用fiddler原因,當然不常用,只有分析從乙個頁面踽另乙個頁面時會用到的它。最近就是要分析乙個頁面跳入後的包資訊,結果...