1現在我著重講解一下while迴圈所做的工作:void makenext(const
char p,int
next)
214 next[q] =k;15}
16 }
已知前一步計算時最大相同的前字尾長度為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 #include3void 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演算法是以什麼方式簡化時間複雜度的?一般我們匹配字串可以用正規表示式,或者拿這個字串與目標字串乙個個比較,那麼就有乙個問題,如...