關於KMP的理解
阿新 • • 發佈:2018-12-10
1、推薦阮一峰的部落格,通俗易懂。(直接點進去看)
2、理解next陣列
3、理解字首和字尾
程式碼模板:
#include <stdio.h> #include <string.h> char a[1000000],b[1000000];//a是文字串,b是模式串 int next[1000000];//期待的next陣列 int main() { int i,j,k; gets(a+1); gets(b+1);//輸入 int L1=strlen(a+1); //計算長度 int L2=strlen(b+1); //int next[1000000]; next[0]=-1;//首位賦值-1 for(i=1;i<=L2;i++)//遍歷一遍 { k=next[i-1];//k初值是-1 ,第二次是0, while(k!=-1&&b[k+1]!=b[i]) //當k不是-1並且 b[1]!=b[2]此處判斷k是否為-1的原因在於,如果回跳到第一個字元就不用再回跳了 k=next[k];//若 b[1]!=b[2],k=next[0]=-1, 通過自己匹配自己來得出每一個點的next值 next[i]=k+1;//next[1]=0, next[2]= } for(i=0;i<=L1;i++) { j=0;//j可以看做表示當前已經匹配完的模式串的最後一位的位置,也可以理解為j表示模式串匹配到第幾位了 if(j==L2) printf("%d\n",i-L2+1); while(j&&a[i+1]!=b[j+1]) j=next[j];//如果失配 ,那麼就不斷向回跳,直到可以繼續匹配 if(a[i+1]==b[j+1]) j++;//如果匹配成功,那麼對應的模式串位置++ } return 0; }
時間複雜度:Θ(m+n)
每次位置指標i++時,失配指標jj至多增加一次,所以jj至多增加len次,從而至多減少len次,所以就是\Theta(len_N + len_M) ==Θ(N+M)的