next函数

#include<cstdio>//下标从0开始的写法!!天勤书上是下标从1开始的!!! 
#include<cstring>
#include<iostream>
using namespace std;
struct str{
	string s;
	int next[50]={0};
};
string zhu="555asssada555dsf"; 
void getnext(str& sub){
	int i=0,j=-1;//参数加一 
	sub.next[0]=-1;//参数加一 
	while(i<sub.s.size()-1){//加一 
			if(j==-1||sub.s[i]==sub.s[j]){//参数加一和天勤一样!! 
				++j;
				++i;
				sub.next[i]=j;
			}//把判断是否对称作为核心代码!! 
			else
				j=sub.next[j];
		}
	}
int kmp(str sub){
	int i=0,j=0;
//	cout<<zhu<<" "<<sub.s<<endl;
		while(i<zhu.size()&&j<sub.s.size()){//i==zhu.size()表示主串搜索完毕! 
			if(j==0||zhu[i]==sub.s[j]){//j==sub.s.size()表示匹配成功! 
				i++;
				j++;
				
			}else{
				j=sub.next[j];
			}
		}
	if(j==sub.s.size())
	 return (i-sub.s.size());
	else
	return -1; 
}

int main(){
	str sub;
	cin>>sub.s;
	getnext(sub);
	for(int i=0;i<sub.s.size();i++){
		printf("%d ",sub.next[i]);
	}
	printf("匹配到了!在第%d个字符!",kmp(sub)); 
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值