KMP算法学习

KMP算法

KMP算法讲解

#include<cstdio>
#include<cstring>
int next[100];
void getnext(char *ptr){//构造子串的next表 
	int i=0,k=-1;
	next[0]=-1;
	//加入假想的哨兵,哨兵可视为一个空串,
	//它是任何串的前缀、子串、后缀,当第一个字符失配时,
	//我们用第一个字符于哨兵比对,那么它必然和哨兵匹配
	int n = strlen(ptr);
	while(i<n){
		if(k<0 || ptr[i] == ptr[k]){//匹配 
			i++;
			k++;
			next[i]=k;
		}else{//失配 
			k=next[k];
			//如果当前位置失配,查找已匹配部分公共前后缀位置,直接进行移动 
		}
	}
	for(int i=0;i<n;i++){
		printf("%d ",next[i]);
	} 
}
int KMP(char *p,char *t){
	int i=0,j=0;
	int n=strlen(p);//父串 
	int m=strlen(t);//子串 
	getnext(t);//构造next查询表 
	while(i<n&&j<m){//自左向右,逐个比对字符 
		if(j<0 || p[i] == t[j]){//若匹配 
			i++;
			j++;//则携手共进 
		}else{//否则,子串右移,父串不回退 
			j=next[j];
		}
	}
	return i-j; 
}
int main(){
	char a[100]="sadafafdsdadfssaa";
	char b[100]="ababaaababaa";
	KMP(a,b);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值