【代码记录】进一步理解kmp中的next数组

kmp是一种改进的字符串匹配算法在字符串的匹配问题中,最坏情况下可能需要将目标串全部走完才能完,对于最朴素的做法而言,时

间复杂度可能达到O(子串*目标串),当目标串非常长时,时间复杂度也会非常大。这时候就需要kmp算法来优化。

在对kmp算法有所了解后,我们知道kmp的重点就在于求出next数组,更深入的了解next数组可以做题:

https://www.luogu.com.cn/problem/P4391

https://www.luogu.com.cn/problem/UVA10298

https://www.luogu.com.cn/problem/P2445

对于next[]的理解

next[k] 表示下标为k的字符前面的子串的最长相等前后缀的长度

 同时,next数组的值也表示当字符串不匹配是字符应当回溯的位置。当当前字符不匹配时,就需要回溯,重新去找最长相等前后缀的长度。

 对于next数组的理解和应用是kmp算法的重中之重,在运用kmp时不一定会考字符串的匹配,也会考对next数组的运用。

求next数组代码1

void GetNextval(char* p, int next[])
{
	int pLen = strlen(p);
	next[0] = -1;
	int k = -1, j = 0;
	while (j < pLen - 1)
	{//p[k]表示前缀,p[j]表示后缀  
		if (k == -1 || p[j] == p[k])
		{
			++j,++k;
			if (p[j] != p[k])
				next[j] = k;   
			else
				next[j] = next[k];
		}
		else
			k = next[k];
        //next[k]的值代表的是下标为k的字符前面的字符串最长相等前后缀的长度
        // 也表示该处字符不匹配时应该回溯到的字符的下标
}

acm中更简便的写法

for(int i=2;i<=len;i++)
   {
       while(j&&ne[j+1]!=a[i])  j=ne[j];
       if(a[j+1]==a[i]) j++;
         ne[i]=j;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值