問題描述:
給出模式串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...