資料結構筆記(五) 串 模式匹配

2021-10-03 21:58:14 字數 2692 閱讀 4876

串的儲存結構:與線性表相同,分順序儲存結構和鏈式儲存結構。

模式匹配:對基於同一字元表的任何文字串t(|t|=n)和模式串p(ipl=m),判定t中是否存在某一子串與p相同。若存在(匹配),則報告該子串在t中的起始位置。

蠻力演算法(樸素演算法):將p與t中長度為m的n-m+1個子串逐一比對。

·時間複雜度:o([n-m+1]*m),漸進o(nm)。

int

match

(char

* p,char

* t)

//則轉到下一對字元

else

//否則

//文字串回退、模式串復位

return i - j;

//如何通過返回值,判斷匹配結果?

}int

match

(char

* p,

char

* t)

kmp演算法:構造查詢表next[0, m),一旦在p[j]處失配只需將j替換為next[j],再繼續與t[i]比對。

·時間複雜度:o(m+n)。

·next陣列:模式串最長字首和最長字尾相同的長度(加1)。

當 j = 0 時,next[ j ] = 0;

當 j > 0 時,設 j 所在位置之前的子串所含的最長字首和最長字尾相同時的長度為 k ,則next[ j ] = k + 1。(沒有字首與字尾相同時 k = 0)

模式串ab

cdab

dj01

2345

6最大長度00

0001

2next[ j ] (-1開頭)-10

0001

2next[ j ] (0開頭)01

1112

3

int

*buildnext

(const string& p)

else

t = next[t]-1

;}return next;

}int

match

(const string& t,

const string& p)

else

j = next[j]-1

;delete

next;

return i - j;

}

改進的kmp演算法

模式串ab

abaa

abaj

0123

4567

8最大長度00

0123

112next[ j ] (0開頭)01

1234

223nextval[ j ] (0開頭)01

0104210

int

*buildnext

(const string& p)

else

t = next[t]-1

;}return next;

}

bm演算法:根據模式串p,預先構造gs表和bc表

·方法:自右向左依次比對字元,找到極大的匹配字尾。若完全匹配,則返回位置;否則通過查表,確定p右移的適當位置,並重新自右向左比對。

·時間複雜度:最好o(n/m),最壞o(n+m)。

int

match

(char

* p,char

* t)

delete

gs;delete

bc;//銷毀gs表和bc表

return i;

}

·壞字元(bad character):pattern與text從右往左第乙個匹配失敗的在text中的字元。

①如果字元x在模式串p中沒有出現,那麼從字元x開始的m個文字顯然不可能與p匹配成功,直接全部跳過該區域即可。

②如果x在模式串p**現,則以該字元進行對齊。

bc說明:若p中存在該壞字元,其在p中所處的最右位置;若不存在則為1。

int

*buildbc

(char

* p)

·好字尾(good suffix):pattern與text從右往左連續匹配成功的子串。

①如果在p中位置t處已匹配部分p』在p中的某位置t』也出現,且位置t』的前乙個字元與位置t的前乙個字元不相同,則將p右移使t』對應t方才的所在的位置。

②如果在p中任何位置已匹配部分p』都沒有再出現,則找到與p』的字尾p』『相同的p的最長字首x,向右移動p,使x對應方才p』'字尾所在的位置。

gs說明:若在好字尾之前,存在子串與好字尾匹配,則表示為兩個匹配子串之間的距離。

資料結構2 2串的模式匹配

子串在主串中的定位操作稱為串的模式匹配,記為index s,t,pos 即在主串s中,從第pos個字元開始查詢與子串t第一次相等的位置。若查詢成功,則返回子串t的第乙個字元在主串中的位序,否則返回0。其中主串稱為目標串,子串稱為模式串。基本思想 從目標串的第pos個字元開始與模式串的第乙個字元比較,...

資料結構 字串 模式匹配

我們先把模式串標出序號 接著把模式串所有字首依次列出來 接下來把每乙個子串相等的字首和字尾的最大長度求出,舉個例子 abaab 觀察子串,前字尾ab相同,因此返回2 5.依次類推,我們可以得到每乙個子串對應的一組序列 當時這組資料並不是所要求的next陣列,可以將其稱為部分匹配值表,相應c 如下 獲...

資料結構 字串的模式匹配

什麼叫做模式匹配呢?其實就是看字串s中是否有子串t,那麼t就叫匹配串。我們平時查詢方式是逐個匹配,那麼時間複雜度就是o n m 比如s abcabde t abd 那麼比較的時候s 1 t 1 所以接下來比較s 2 和t 2 結果s 2 t 2 那麼接下來就比較s 3 和t 3 這一次比較匹配不上。...