KMP算法next数组计算方法的优化

本文介绍了KMP算法的核心思想,特别是next数组的计算。通过对失配时的前缀子串和后缀子串分析,提出了一种优化next数组计算的方法。通过举例和无注释的代码展示,阐述了优化思路,欢迎读者交流讨论。
摘要由CSDN通过智能技术生成

KMP算法的原理就是利用相匹配的前缀子串与后缀子串,来确定失配时下次对齐的位置;

其中最关键的就是next数组的确立;

数据结构课本上KMP算法next数组计算经典的例子:

void getNext(const char *pStr, int *nextArr)
{
	int i = 0, k = -1, pLen = strlen(pStr);
	nextArr[i] = k;
	int mLen = pLen - 1;
	while (i < mLen)
	{
		if (k == -1 || pStr[i] == pStr[k])
		{
			nextArr[++i] = ++k;
		}
		else k = nextArr[k];
	}
}

而这个KMP算法next数组计算只关注了前k-1个字符中,前后匹配的子串,没有利用到当前失配的字符;

比如:ABACA,当第2个A失配时,说明被匹配串的当前位置的字符必定不等于A,所以将第0位对齐到此位也必定失配,所以应该继续回溯到第0位失配时所需要对齐的位,这里也就是-1;

这个"必定不等于(!=)"是可以被利用的!我们对KMP算法next数组计算的优化正是基于此;

废话不多说,下面是优化后的KMP算法next数组计算与注释:


                
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值