模式串匹配問題

2021-07-09 03:37:15 字數 1209 閱讀 1592

問題描述:

給出模式串p和文字串t

有以下問題:1、模式串是否出現在文字串。2、文字串中出現模式串的所有位置。3、模式串在文字串出現的次數。(暫時想不出那麼多)

對於上述的每個問題都可以逐個字元比較來找出答案。**如下

for(int i=0;i

顯然上述演算法的時間複雜度是o(n*m)。

對於k個模式串問題時,時間複雜度就是o(n*m*k)。

對於乙個模式串的匹配問題,可以使用kmp演算法。

kmp演算法的核心在於利用模式串的特點,匹配失效時不是把模式串簡單地後移一位,而是根據已匹配的部分進行移位。

t:ababacabacadagh

s:abacab

ababada

bacadagh

abacab

樸素演算法中模式串s失效後,模式串向後一位,如下圖

ababada

bacadagh

abacab

而在kmp演算法中,模式串如下移位

ababada

bacadagh

abacab

由上圖可知,字元比較的位置不變,依然在t的第6個字元,模式串向後移動兩個位置。時間複雜度可以達到o(n)

進行這樣的移位,需要先構造模式串的失效指標fail。

構造失效指標**如下:

int i,j;

fail[0]=-1;

j=-1;i=0;

while(i

失效指標的使用:

i=0;j=-1;

while(i

通過kmp演算法,單模式串匹配的時間複雜度就降為o(n+m)。

而在k模式串的情況下,可以對每個模式串使用kmp演算法來進行匹配,設l=|所有模式串的長度之和|,則時間複雜度為o(kn+l)。

在模式串較多的時候,該方法就不好用了。

ac自動機就可以解決多模式串匹配問題。

可以使用trie樹改造來實現ac自動機。

**如下:

struct actree

temp=fail[temp];}}

}};

ac自動機構造時,把結點不存在的邊指向。在匹配時就不需要判斷。即ch[u][i]=ch[fail[u]][i],不存在的邊指向失效指標的對應字元結點。

這樣匹配的時間複雜度為o(n),構造ac自動機的時間複雜度為o(l)。

總時間複雜度是o(l+n)。

字串的模式匹配問題

針對字串的模式匹配問題,解決的演算法有挺多的,下面就把我所知道的一一介紹吧。第一種,樸素模式匹配 時間複雜度為o mn 之所以把這種演算法稱作樸素模式匹配,我想大概是因為這個演算法可以看做是在通過遍歷,從而完成匹配,這種方式應該是比較樸素的。個人看法 舉例來說吧。主串s abcdabcde 子串t ...

串的模式匹配

最近在學 vc include stdafx.h include include define max size 1000 串的模式匹配 功能 找出str2字串在str1字串中第一次出現的位置 不包括串結束符 返回 該位置的序號 環境 visual c 2008 注意 1.此為樸素的模式匹配演算法,...

串的模式匹配

以前每次看到字串匹配,一律跳過,今天耐著性子研究了下,依舊是半混沌狀態,先整理放在這,以備後用。這篇文章幫助很大,樸素匹配演算法 kmp演算法,收藏先。1.樸素匹配演算法 int patternmatch common const char pstring,const char ppattern i...