程式設計實現kmp演算法

2021-07-15 11:41:10 字數 1415 閱讀 2524

1

void makenext(const

char p,int

next)

214 next[q] =k;15}

16 }

現在我著重講解一下while迴圈所做的工作:

已知前一步計算時最大相同的前字尾長度為k(k>0),即p[0]···p[k-1];

此時比較第k項p[k]與p[q],如圖1所示

如果p[k]等於p[q],那麼很簡單跳出while迴圈;

關鍵!關鍵有木有!關鍵如果不等呢???

那麼我們應該利用已經得到的next[0]···next[k-1]來求p[0]···p[k-1]這個子串中最大相同前字尾

,可能有同學要問了——為什麼要求p[0]···p[k-1]的最大相同前字尾呢???是啊!為什麼呢? 原因

在於p[k]已經和p[q]失配了,而且p[q-k] ··· p[q-1]又與p[0] ···p[k-1]相同,看來p[0]···p[k-1]這麼長的子串是用不了了,那麼我要找個同樣也是p[0]打頭、p[k-1]結尾的子串即p[0]···p[j-1](j==next[k-1]),看看它的下一項p[j]是否能和p[q]匹配。如圖2所示

附**:

1 #include2 #include

3void makenext(const

char p,int

next)

416 next[q] =k;17}

18}1920

int kmp(const

char t,const

char p,int

next)

2135

if (q ==m)

3639

} 40}

4142

intmain()43;

46char t = "

ababxbababcadfdsss";

47char p = "

abcdabd";

48 printf("

%s\n

",t);

49 printf("

%s\n

",p );

50//

makenext(p,next);

51kmp(t,p,next);

52for (i = 0; i < strlen(p); ++i)

5356 printf("\n"

);57

58return0;

59 }

KMP演算法實現

核心是模式串next陣列的生成 include stdio.h include string h define ns 100 intstrpos char s1 char s2 intn void next char s2,int n int main intargc,char args next ...

Python程式設計KMP匹配演算法及實現

kmp演算法 字串匹配的一種基本演算法,比如 在bab abcaabcda中匹配字串abcd 即在母串中檢視是否包涵字串 對字串abcd進行檢索 第一步 發現a與b不匹配則,把a向後移動一位 第二步 發現第乙個字元a匹配,再尋找第二個字元b也匹配,再尋找第三個字元c不匹配,按照往常的做法將字串abc...

js實現kmp演算法 js實現KMP演算法,淺顯易懂

開始 首先,kmp演算法是用來幹什麼的?用來匹配字串,如果匹配,返回索引值。其次,為什麼要用kmp演算法?因為能簡化時間複雜度 廢話,演算法都是用來提公升效率的 然後,kmp演算法是以什麼方式簡化時間複雜度的?一般我們匹配字串可以用正規表示式,或者拿這個字串與目標字串乙個個比較,那麼就有乙個問題,如...