BF与KMP算法学习记录

1.BF核心代码为:i=i-j+2;j=1;
即匹配失败时,主串的游标i移动到上一轮开始位置的下一个位置,子串的游标j回到第一个位置
2.kmp算法理解next与nextval数组的推导过程与求解方法。
理解kmp算法如何用next数组匹配

#include <stdio.h>
#include <string.h>
#define MAXLEN 255
//J移动的次数 
int t1,t2=0;
typedef struct{
	char ch[MAXLEN+1];
	int length;
}SString;
int *next(SString T){
	int next1[MAXLEN+1];
	int i=1;
	next1[1]=0;
	int j=0;
	while(i<T.length){
		if(j==0||T.ch[i-1]==T.ch[j-1]){
			++i;
			++j;
			next1[i]=j;
		}else{
			j=next1[j];
		}
	}
	return next1;
} 
int KMP(SString S,SString T,int next[]){
	int i=1;
	int j=1;
	while(i<=S.length&&j<=T.length){
		if(j==0||S.ch[i-1]==T.ch[j-1]){
			++i;
			++j;
		} else{
			j=next[j]; 
		}
		t1++;
	}
	if(j>T.length) return i-T.length;
	else return 0;
}
int BF(SString S,SString T){
	int i=1;
	int j=1;
	while(i<=S.length&&j<=T.length){
		if(S.ch[i-1]==T.ch[j-1]){
			++i;
			++j;
		}else{
			i=i-j+2;
			j=1;
		}
		t2++;
	} 
	if(j>T.length) return i-T.length;
	else return 0;
} 
int main()
{
	SString S,T;
	while(1){
		scanf("%s",S.ch);
		scanf("%s",T.ch);
		S.length=strlen(S.ch);
		T.length=strlen(T.ch);
		int *t=next(T);
		printf("%d\n",KMP(S,T,t));
		printf("%d\n",BF(S,T));
		printf("KMPj移动次数为:%d\n",t1);
		printf("BFj移动次数为:%d\n",t2);
		int n;
		printf("输入1继续,0结束\n");
		scanf("%d",&n);
		if(n==0) break;
	}
	
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值