串的儲存結構:與線性表相同,分順序儲存結構和鏈式儲存結構。
模式匹配:對基於同一字元表的任何文字串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 這一次比較匹配不上。...