1. 程式人生 > >關於KMP的理解

關於KMP的理解

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)的