KMP算法——求next数组

问题的提出

在朴素模式匹配算法下,主串指针往往需要回溯到第一个位置重新进行比较,现在为了减少回溯的现象,要想办法把重复比较的步骤给跳过。

朴素模式匹配算法的改进

每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向右滑动尽可能远的距离,再进行比较,这个时候就引出了next数组,因为模式串往往比主串短得多,所以求next数组的代价也不会很大。

next数组求法

例子:模式串为ABABABB
步骤:(1)先写好模式串下标
(2)再把模式串抄上去
(3)再根据最长重合的子串的长度再加上1就是要求的next数组了
下标: 1 2 3 4 5 6 7
子串: A B A B A B B
next数组:0 1 1 2 3 4 5
下标6的next数组:因为B前面的串为ABABA,可以得到最长子串是ABA,因为如果不是求最长的子串,而是求最短的子串,在移动模式串和主串进行比较是会跳过一些情况,在这里如果得到的子串是A,模式串直接跳到下标5的位置进行比较,就会忽略了下标3开始比较的这种情况。
next数组的代码:

void  getNext(Str substr,int next[]){
	int j=1,t=0;
	next[1]=0;
	while(j<substr.length){
		if(t==0||substr.ch[j]==substr.ch[t]){
			next[j+1]=t+1;
			++t;
			++j;
		}
		else
			t=next[t];
	}
}

t=next[t]是重复利用之前的结果
具体解释可以看一下这位兄弟的文章:https://www.cnblogs.com/dusf/p/kmp.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值