字串的模式匹配

2021-08-26 09:43:03 字數 1558 閱讀 2561

字元有一類重要運算:模式匹配。設t和p是兩個字串(t的長度為n,p的長度為m,1<=m<=n),t 為目標,p為模式,在t中查詢是否有與p相等的子串。如果有,則給出p在t的匹配位置,這個運算被稱為模式匹配,模式匹配的方法主要有兩種:

(1)樸素的模式匹配,也稱brute force演算法

(2)kmp演算法

(3)bm演算法

演算法思想:從目標串的的第乙個字元起與模式串的第乙個字元比較,若相等,則繼續對字元進行後續的比較,否則目標串從第二個字元起與模式串的第乙個字元重新比較,直至模式串中的每個字元依次和目標串中的乙個連續的字串行相等為止,此時稱為匹配成功,否則匹配失敗。最壞的情況是每遍比較都在最後出現不等,即沒變最多比較m次,最多比較n-m+1遍,總的比較次數最多為m(n-m+1),因此樸素的模式匹配演算法的時間複雜度為o(mn),效率低下。

for(i=0;ibrute force演算法存在大量的重複運算,為了避免重複運算,引入kmp演算法。複雜度o(m+n)

設p為「abcabb」,這個串中「ab」是p的字首,也是串「abcab」的字尾。所以如果在匹配的時候直到「abcab」都匹配成功,而「abcabb」匹配失敗,所以t肯定有串為「abcab」,所以可以直接將j指標指向移動到第k位。k滿足: 

p[0 ~ k-1] == p[j-k ~ j-1]ab

cabc(i)dh

ijab

cabb(j) a

bcab

c(i)dh

ijab

c(j)ab

b利用已經部分匹配這個有效資訊,保持i指標不回溯(t),通過修改j指標(p),讓模式串盡量地移動到有效的位置。

也就是說我們要計算每乙個位置j對應的k,所以用乙個陣列suffix來儲存,suffix[j] = k,表示當t[i] != p[j]時,j指標的下乙個位置。

kmp演算法的關鍵是求p的字首suffix。

suffix[j] = max

有了字首函式suffix,可將p匹配t的過程寫成一重迴圈,從p[0]出發,依次t[0],t[1],t[2],...,t[n-1]。

若p[j]和t[i]匹配成功,則下一次匹配p[j+1]和t[i+1].

若p[j]和t[i]匹配失敗,則t[i]不斷的匹配p[suffix[j]],p[p[suffix[j]]],...,直到匹配成功(t[i]==p[..p[suffix[j]]])或者匹配失敗(p[...p[suffix[j]]]=-1);若匹配成功,則下一次比較p[p[...p[suffix[j]]]+1] 與 t[i+1] ;若匹配失敗,則下一次比較p[0]與t[i+1]

i=0;

j=0; //t和p的匹配指標初始化

while(im-1) //匹配完畢

return (i-(m-1));

else

return (-1); //匹配失敗

字串模式匹配

include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...

字串模式匹配

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...

字串模式匹配

bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...