KMP算法

//匹配算法
int Index_KMP(SString S,SString T,int next[]){
	//初始化游标,i为匹配游标,j为模式游标
	int i = 1,j = 1;
	//以游标越界为条件循环
	while(i <= S.length && j <= T.length){
		//第一次循环时如果S.ch[1] == T.ch[1],则i=2,j=2,比较第二位.
		//S.ch[1] != T.ch[1],则j = 0;跳转到第二次循环;由判断条件j == 0,i = 2,j = 1.
		//In general,s1=t1,i=j=2;
		///s1!=t1,i=2,j=1
		if(j == 0 || S.ch[i] == T.ch[j]){
			i++;
			j++;
		}
		else
			j = next[j];
	}
	if(j > L.length)
		return i - T.length;
	else
		return 0;	
}

void get_next(SString T,int next[]{
	//初始化游标i,j
	int i = 1,j = 0;
	//初始化next数组(递归构造后续,给出a_1;
	next[1] = 0;
	//游标i的边界作为循环条件(不指向T的最后一个字符,为什么?)
	while(i <= T.length){
		//第一次循环时,j == 0进入第一个条件,j = 1,i = 2;next[2] = 1;
		//第二次循环时,比较a_1与a_2;如果相等,j = 2,i = 3;next[3] = 2;
		//如果一直触发条件1,相当于一直进行最大前缀和最大后缀的匹配next[]={,0,1,2,3,4,5,6,...,n}
		//如果在某次触发条件2,j回退到next[j],由next[2] = 1;后续不再触发条件j == 0;仅做比较T.ch[i] == T.ch[j]
		if(j == 0||T.ch[i] == T.ch[j]){
			++i;++j;
			next[i] = j;
		}else
			j = next[j];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值