关于KMP

在这里插入图片描述
从图中我们可以看出来两个字符串的匹配在bc之间出现不同,如果用穷绝法的话
在这里插入图片描述
我们需要从头开始,无疑是增加了很多不必要的回退
这里我们讲一讲kmp算法
在这里插入图片描述
在这里插入图片描述
红色的数字就是j需要回退的位置,这个是如何计算得到的?

a为首元素固定为0,b为第二个元素固定为1,

从第三个位置的C看起

在这里插入图片描述
k为j的回退值,k-1=最大字串的长度(为什么后面讲)
此时分别正着和倒着取X个数,例如当x=1时,a和b不等,k-1=0。
x=2,ab和ba不等,k-1=0,k=1,所以c回退值为1
在这里插入图片描述
我们看一个更复杂的
x=1,a和b不同,k-1=0,k=1
x=2,ab和ab相等,k-1=2,k=3
x=3,abc和bab不等
x=4,abca和abab不等
x=5,abcab和cabab不等
x=6,abcaba和bacabab不等
因为不能取整个字符串,所以k的最大值是3,故c的回退值为3

解释为什么要k-1= max{X}

在这里插入图片描述
从蓝色框里可以看出来上下完全一样!!!
b的前面abca中的子串当X=1时才相等,这说明b前面一个a和abcac的a相等,那X=1,为什么要k-1=1,k=2?
因为X=1指向的是字串的最后一个字符a,这是已经相等的结果,所以我们需要比较相等字符串的下一个字符,所以X+1=k
在这里插入图片描述
在这里插入图片描述

int Index_KMP(SString S, SString T, int pos){  // 父串,子串,指定位置
	i = pos, j = 1;
	while (i < S.length && j < T.length){
		if (j == 0 || S.ch[i] == T.ch[j]){
			i++;
			j++;
		}
		else
			j = next[i];   //i不变,j后退
	}
	if (j > T.lenght) return i - T.lenght;  // 匹配成功
	else return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值