字串匹配之kmp

2021-06-03 00:37:02 字數 1064 閱讀 4829

**:

kmp主要就是計算字首函式e[q]=max

return m;

}void kmp(char s,char p)

;int n = strlen(s);

int m = prefixcomp(p,e);

int k = 0;

for(int i=1;i<=n;++i)

}putchar('\n');}

習題:試說明如何通過檢查字串pt的字首函式e,來確定模式p在文字t中出現的位置.

解答:根據《的傳遞性,..< p(e[e[i]]) < p(e[i]) < pi,即若x是p(e[e[e[..e[i]]]])的字尾,那麼它是p(e[e[e[i]]])的字尾,那麼也是p(e[e[i]])的字尾,..,是pi的字尾.

int m = strlen(p);

strcat(p,s);

int e[m] = ;

prefixcomp(p,e);

int len = strlen(p);

for(int i=2*m;i<=len;++i)

習題:寫出乙個線性演算法,以確定文字t是否是另乙個字串t'的迴圈轉移.例如,arc和car是彼此的迴圈轉移.

解答:生成文字t'tt,然後計算字首函式,掃瞄文字t'tt,若e[i]>=|t'|即可.

習題:設y^i表示字串y與其自身並置i次所得結果.例如(ab)^3=ababab.如果對某個字串y∈s和某個r>0有x=y^r,則稱字串x∈s具有重複因子r.設w(x)表示滿足x具有重複因子r的最大值r.寫出一有效演算法計算出w(pi)(i=1,2,...,m),演算法的輸入為模式p[1,..,m],演算法執行時間是多少?

解答: 先證明:pq是基於重複因子的字串當且僅當pk是基於重複因子的字串且pk滿足e[q]=max,q-k|k.

==>: 因為pq是基於重複因子r的字串,所以pq可以表示成yyy..yy=y^r的形式,顯然,pk=y^(r-1),且q-k=r-(r-1)=1|r-1.

<==:已知pk是基於重複因子的字串,且pk滿足e[q]=max

for(int i=1;i<=n;++i)

else}

字串匹配查詢之KMP

在c c 語言程式設計過程中,一般的字串搜尋操作都是通過標準庫的strstr 函式來完成的,這在通常的情況下,因為字串的搜尋操作不多,並不會產生效率問題。實際上,這個函式的時間複雜度不容樂觀。如果要從長度為n的字串中查詢長度為m的子字串,那麼這個strstr 函式的最壞時間複雜度為o n m 可見,...

字串匹配之KMP演算法

以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。廢話不說了,我們直接入題。說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法...

演算法 字串匹配之KMP

說人話就是 比如有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,kmp演算法是最常用的之一。首先對於上面的 比如 我們首先要針對搜尋詞 abcdabd 算出一張 部分匹配表 接下來就很簡單了,將字串和搜尋詞都從...