算法学习之KMP

1.算法的应用
存在两个不等长的字符串,判断短的字符串是否长的字符串的字串,如果是返回子串的首个字符的下标;如果否,则返回0.
注:长字符串的第一元素为字符的长度。
2.算法的关键:求next数组
T为长字符串
(1).[next数组]: 当模式匹配串T失败的时候,next数组对应的元素指导用T串的哪个元素进行下一轮的匹配;
(2).前缀:T[i],为固定的;
(3).后缀:T[j],为相对的,当前匹配元素的前一个;
(4).匹配原则:
当T[i]==T[j]时,i++,j++,next[i]数值等于j;
不同,就j要回溯到next[j]的值开始;
在这里插入图片描述
(5)优化
如果发生失配时,后缀与前面的一致,退回到前缀对应的next[i]对应的值;
在这里插入图片描述

代码实现

void getNext(string T,int *next)
{
	int j=0,i=1;
	next[1] = 0;
	while(i<T[0])	//T[0]存放长字符串的长度
	{
		if(0 == j || (T[i] ==T[j])){
			i++;
			j++;
			if(T[i] ==T[j]) next[i] =next[j];
			else next[i] = j;
		}else{
			j =  next[j];
		}
	}
}

3.实现字串查找
查找成功返回子串的首个字符的下标;如果否,则返回0.

int indexKMP(string S,string T,int pos)
{
	int i = pos;
	int j = 1;
	int next[255];
	getNext(T,next);
	while(i<=S[0]&&j<=T[0])//s[0]存放数值的长度
	{
		if(0 == j || S[i] == T[j]){
			i++;
			j++;
		}else{
			j = next[j];
		}
	}
	if(j>T[0]) return i-T[0];
	else return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值