KMP算法

<pre name="code" class="cpp">/*
這是對失配函數沒有優化的MP算法,最壞情況下也能達到O(m + n)的複雜度,
其中m爲模板串長度,n爲文本串長度.
此算法還可以計算模板串在文本中出現的次數(可重疊)
*/
char s[maxn],t[maxn];//s爲文本,t爲模板  
int f[maxn];//失配函數  
void getFail(char *P,int *f){//注意適配函數是對模板進行處理  
    int m = strlen(P);  
    f[0] = 0,f[1] = 0;  
    for(int i = 1;i < m;i++){  
        int j = f[i];  
        while(j && P[i] != P[j])j = f[j];  
        f[i + 1] = P[i] == P[j] ? j + 1 : 0;  
    }  
}  
  
int find(char *T,char *P,int *f){//其中T爲文本,P爲模板,在T中找P的第一次出現的位置。  
    int n = strlen(T),m = strlen(P);  
    getFail(P,f);//初始化失配函數  
    int j = 0;  
    for(int i = 0;i < n;i++){  
        while(j && P[j] != T[i])j = f[j];  
        if(P[j] == T[i])j++;  
        if(j == m){
			return i - m + 1;//匹配上的位置  
			/*
			   若要知道模板在文本中出現的次數,可以這樣寫
			   ans++;//其中ans爲出現次數
			   j = f[j]//如果計算重疊的就這樣寫,例如aaaa,   aa ,那麼出現的地方爲0,1,2
			   j = 0;//如果計算不重疊的就這樣寫,例如aaaa,   aa,那麼出現的地方爲0,2
			*/
		}
    }  
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章