資料結構學習筆記(一) 字串的模式匹配

2022-10-10 17:48:11 字數 1280 閱讀 4637

參考:

北京大學資料結構與演算法c++

已有乙個目標字串t,給定模式p,在目標字串t中搜尋與模式p全同的乙個字串,並求出t中與p全同匹配的字串(「簡稱為配串」),並返回其首字元位置

例如:在字串「hello world」中找到「llo」並返回l

利用窮舉法,逐個字元後移匹配,如果該次匹配失敗,則需要首字元後移到上次首字元的下乙個,在逐個字元進行匹配,時間複雜度大。即嘗試所有的可能情況,包含多次冗餘比較。

**實現:

執行結果:

輸出2

int findpat_2(string t, string s, int startidx)

else

if (j >= s_len)

return i - j;

} return -1;

}}

執行結果:

輸出2t長度為n,模式長度為m,m<=n

如果n的游標每一次移動進行比較匹配,則一共需要比較(n-m+1)次

每一次相同匹配所耗費的時間最壞情況下是m

因此整個演算法的最壞時間開銷估計為o(m*n)

在匹配中,包含很多冗餘匹配,在上一次匹配中已經知道後移一位不滿足條件,應該將其去除,減少比較次數。

暴力法進行匹配時,主串和模式串的指標i,j都需要進行回退,而主串的指標回退位數超過了合理範圍,導致比較次數增加。對於乙個給定的模式串,其中每個字元都有可能會遇到匹配失敗,這時對應的 j 指標都需要回溯,具體回溯的位置其實還是由模式串本身來決定的,和主串沒有關係。

模式串中具有一定的規律,該規律有效利用可以減小比較次數

計算方法是:對於模式串中的某一字元來說,提取它前面的字串,分別從字串的兩端檢視連續相同的字串的個數,在其基礎上 +1 ,結果就是該字元對應的值。

每個模式串的第乙個字元對應的值為 0 ,第二個字元對應的值為 1 。

字串 「abcabac」 對應的 next 陣列中的值為(0,1,1,1,2,3,2)

詳見參考

kmp演算法(快速模式匹配演算法)詳解以及c語言實現

//next陣列計算

void next(string a, int* next)

else

cout << "i: " << i << " j: " << j << " next: " << next[j] << endl;

}}

python學習筆記(一) 字串

字串是python中最常用的資料型別。我們可以使用引號 或 來建立字串。建立字串很簡單,只要為變數分配乙個值即可。例如 var1 hello var2 world python不支援單字元型別,單字元在python中也作為乙個字串使用。python訪問子字串,可以使用方括號來擷取字串,例如 通過索引...

字串(一) 字串Hash

今天開一手最不 tao 擅 yan 長的字串演算法 字串hash演算法。似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為 優雅的暴力 何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...

python學習筆記 一 字串與列表

字串的一些處理 字串的大小寫 name lonmar hb print name.upper 全大寫 print name.lower 全小寫 print name.title 每個單詞首字母大寫 輸出結果將是 合併字串 first name qwq last name lovl full name...