改进的k m p算法

前面的文章中讲述K M P算法的的基本实现,这里提供 了改进后的K M P算法的实现 ,手动验算过,靠谱!!
相比于之前,就是在计算next值的同时多了一次比较,如果a位字符与它的next值指向的b位字符相等,则a位的nextva就指向b位的nextval,如果不相等,则该a位的nextval值就是它自己a位的next值.添加链接描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int next[100];//全局变量
int KMP(char S[],char T[]){
int i=0,j=0;//指向S,j指向T
int length_s=strlen(S),length_t=strlen(T);
while(i<length_s&&j<length_t){
if(j==-1||S[i]==T[j]){
	++i;
	++j;
}else{
	j=next[j];
}
}
	if(j>=length_t){
	return i-j;
}
	return -1;
}
//改进的next算法
void get_next(char *ch,int *next){
 	next[0]=-1;//第一个字符设为-1;
	int i=0,j=-1;
	int length=strlen(ch);
	while(i<length-1){
	if(j==-1||ch[i]==ch[j]){
	i++;
	j++;
	if(ch[i]!=ch[j]){
	next[i]=j;
}else{
	next[i]=next[j];
}

}else{
	j=next[j];
}
}

}
	int main(){
	char s[100],t[100];
	printf("请输入待匹配的字符串\n");
	scanf("%s",s);
	printf("请输入匹配字符串\n");
	scanf("%s",t);
	get_next(t,next);
	for(int i=0;i<strlen(t);i++){
	printf("%d\n",next[i]);
	}
	int i=KMP(s,t);
 if(i!=-1){
	printf("从第%d个字符开始\n",i);
}else{
	printf("没有找到匹配的字符");
}

}

猜你喜欢

转载自blog.csdn.net/Zyong139064359/article/details/89703665
今日推荐