如果在主串Tag的第pos個位置後存在

2021-06-20 13:49:18 字數 1531 閱讀 1843

子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文字處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位:

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

print

?/*返回子串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

print

?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原因,當然不常用,只有分析從乙個頁面踽另乙個頁面時會用到的它。最近就是要分析乙個頁面跳入後的包資訊,結果...