模式匹配算法

BF

#include<iostream>
#define MAXA 700
using namespace std;
typedef struct {
	char ch[MAXA];
	int length;
} str;
int bf(str s,str p);

int main(void) {
	//模式串初始化
	str s;
	s.length=8;
	s.ch[0]='a';
	s.ch[1]='b';
	s.ch[2]='a';
	s.ch[3]='a';
	s.ch[4]='b';//acabaabaabcacaabc
	s.ch[5]='c';//abaabcac
	s.ch[6]='a';
	s.ch[7]='c';
	//next的确定
	//主串初始化
	str t;
	t.ch[0]='a';
	t.ch[1]='c';
	t.ch[2]='a';
	t.ch[3]='b';
	t.ch[4]='a';
	t.ch[5]='a';
	t.ch[6]='b';
	t.ch[7]='a';
	t.ch[8]='a';
	t.ch[9]='b';
	t.ch[10]='c';
	t.ch[11]='a';
	t.ch[12]='c';
	t.ch[13]='a';
	t.ch[14]='a';
	t.ch[15]='b';
	t.ch[16]='c';
	t.length=17;


	cout<<"//"<<bf(t,s);
	return 0;
}



int bf(str s,str p){
	int i=1,j=1;
	while(i<=s.length && j<=p.length){
		cout<<i<<","<<j<<endl;
		if(s.ch[i-1]==p.ch[j-1]){
			++i;++j;
		}else{
			i=i-j+2;
			j=1;
		}
		
	}
	
	if(j>p.length)return i-p.length;
	else return 0;
}

KMP

#include<iostream>
#define MAXA 700
using namespace std;
typedef struct {
	char ch[MAXA];
	int length;
} str;
void getNext(str s,int next[]);
int KMP(str s,str t,int pos=1);
int main(void) {
	//模式串初始化
	str s;
	s.length=8;
	s.ch[0]='a';
	s.ch[1]='b';
	s.ch[2]='a';
	s.ch[3]='a';
	s.ch[4]='b';
	s.ch[5]='c';
	s.ch[6]='a';
	s.ch[7]='c';
	//next的确定
	//主串初始化
	str t;
	t.ch[0]='a';
	t.ch[1]='c';
	t.ch[2]='a';
	t.ch[3]='b';
	t.ch[4]='a';
	t.ch[5]='a';
	t.ch[6]='b';
	t.ch[7]='a';
	t.ch[8]='a';
	t.ch[9]='b';
	t.ch[10]='c';
	t.ch[11]='a';
	t.ch[12]='c';
	t.ch[13]='a';
	t.ch[14]='a';
	t.ch[15]='b';
	t.ch[16]='c';
	t.length=17;


	cout<<"//"<<KMP(t,s);
	return 0;
}
void getNext(str s,int next[]) {
	int i=1;
	int j=0;
	next[i]=j;
	while(i<=s.length) {
		if(j==0 || s.ch[i-1]==s.ch[j-1]) {
			i++;
			j++;
			next[i]=j;
		} else {
			j=next[j];
		}
	}
	for(i=1; i<=8; i++) {
		cout<<next[i]<<endl;
	}
}
void getNextval(str s,int nextval[]) {
	int i=1;
	int j=0;
	nextval[i]=j;
	while(i<=s.length) {
		if(j==0 || s.ch[i-1]==s.ch[j-1]) {
			i++;
			j++;
			if(s.ch[i]!=s.ch[j])nextval[i]=j;
			else nextval[i]=nextval[j];
		} else {
			j=nextval[j];
		}
	}
	for(i=1; i<=8; i++) {
		cout<<nextval[i]<<endl;
	}
}
int KMP(str s,str t,int pos) {
	int next[t.length+1];

	getNext(t,next);

	int i=pos;
	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];
		}
	}
	if(j>t.length)return(i-t.length);
	else return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值