類似題目:
#include
#include
intnext[10001];
int len1,len2,total;
char str[10001],buf[1000001];
void get_next()
else
j=next[j]; //為何遞迴字首索引j = next[j],就能找到長度更短的相同字首字尾呢?這又歸根到 next 陣列的含義。我們拿字首 p0 pj-1 pj 去跟字尾 pi-k pi-1 pi 匹配,如果 pj 跟 pi 失配,下一步就是用 p[next[j]] 去跟 pi 繼續匹配,如果 p[ next[j] ]跟 pi 還是不匹配,則需要尋找長度更短的相同字首字尾,即下一步用 p[ next[ next[j] ] ] 去跟 pi 匹配。此過程相當於模式串的自我匹配,所以不斷的遞迴 j = next[j],直到要麼找到長度更短的相同字首字尾,要麼沒有長度更短的相同字首字尾。
}}void kmp()
}}int main()
return
0;}
模式串匹配 KMP
樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o m n 而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。kmp演算法的緊隨便是覆蓋函式next。當模式串p j 和文字串s i 失配時,j指標不是簡單的回溯,而是指向next j 覆蓋函式next如何定...
模式串匹配,kmp
include include include include define maxstrlen 255 可以在255以內定義最大串長 typedef char sstring maxstrlen 1 0號單元存放串的長度 void get next sstring t,int next void ...
kmp模式串匹配
作用 字串匹配 我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。如果有則返回出現了t的首位字元位置 當然,這個陣列是從0開始 如果沒有則返回0。通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。下面的描述 strin...