串:KMP算法

 

//KMP算法(包括改進KMP算法)
#define MAXLEN 25
#include<stdio.h>
#include<string.h>
typedef struct{
	char ch[MAXLEN];//ch[0]不用,從ch[1]開始存,位序與下標相等,能存24個數據元素 
	int length;
}SString;

void get_next(SString T,int next[]){//求next數組 
	int i=1,j=0;//next[i]=j
	next[1]=0;//特別地,next[1]=0
	while(i<T.length){
		if(j==0||T.ch[i]==T.ch[j]){
			i++;
			j++;
			next[i]=j;
		}else{
			j=next[j];
		}
	}
}

void get_nextval(SString T,int nextval){
	int i=1;j=0;//nextval[i]=j
	nextval[1]=0;
	while(i<T.length){
		if(j==0||T.ch[i]==T.ch[j]){
			i++;
			j++;
			if(T.ch[i]!=T.ch[j]) nextval[i]=j;
			else nextval[i]=nextval[j];//消除遞歸,追根溯源 
		}
		else{
			j=nextval[j];
		}
	}	
}

int index_KMP(SString S,SString T,int next[]){//KMP
	int i=1,j=1;//主串和模式串的指針
	while(i<=S.length&&j<=T.length){
		if(j==0||S.ch[i]==T.ch[j]){//當第一個字符就不匹配時,ij都右移一位 
			i++;
			j++;
		}else{
			j=next[j];
		}
	}
	if(j>T.length)return i-T.length;//匹配成功 
	return 0;//匹配失敗 
}

int main(){
	char* ss="googlegoogle";
	char* tt="abaabcaba";
	
	SString S,T;
	//init
	for(int i=1;i<13;i++){
		S.ch[i]=ss[i-1];
	}
	S.length=12;
	for(int i=1;i<10;i++){
		T.ch[i]=tt[i-1];
	}
	T.length=9;
	
	int next[9];
	get_next(T,next);
	
	for(int i=1;i<=9;i++)
		printf("%d ",next[i]);
		
	return 0;
}

 

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