KMP(学习模板)

KMP:无非就是求两种东西:1. next数组 。2.KMP匹配

思路:求next数组,可以认为是对子字符串*2(也可以理解为自我匹配)进行求对应位置的相同的抽象化,在比对的过程中分为两种可能,1.匹配成功 则进行 指针++ 2.匹配不成功 则进行回退操作(假如 k是最初指向 -1的指针)回退操作为:k=next[k];

求kmp,思路和求next极其相似,求取next数组是两个相同的字符串进行比较,而kmp则是 匹配两个不同字符串,并且需要通过子字符串求出的next数组进行对子字符串的回退(这里又提到了回退)。

#include <bits/stdc++.h>
using namespace std;

string far,son;
int next[1000];
void getnext(){
	int j=0,k=-1,len=son.size();
	next[0]=-1;
	while(j<len){
		if(k==-1||son[j]==son[k])//from begin start,if equal,willoperat 
			next[++j]=++k;
		else
			k=next[k];//if else not equal ,will return less lacation 
	}
}

int KMP(){
	int i=0,j=0,len1=far.size(),len2=son.size();
	
	while(i<len1){
		if(j==-1 ||far[i]==son[j]){
			++j,++i;
		}
			
		else
			j=next[j];	
				
		if(j==len2)//just meet the conditions
			return 1;
	} 
	return 0; 
}
int main(){
	cin>>far>>son;
	getnext();
	if(KMP())
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr顺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值