KMP算法初探

KMP算法的优势: 充分利用模式串自生的信息, 避免主串回溯.

KMP算法中,模式串的每一个字符都有相应的next值. next值, 其实就是失配后, 接下来使用模式串的next[j]处的字符来比对,而不是从模式串的开始字符. 


两个变量,一个指向当前要计算next的字符,即指针k; 一个value值,我的理解就是位置.

如果有覆盖的话,value的值其实是向前推进的,而如果没有覆盖,它会往前回溯到前一个可能发生或延续覆盖的地方.

当value为-1时,则 i++ , 主串后移一位,模式串从头开始,新一轮匹配.

#include <IOSTREAM>
#include <STRING>
using namespace std;

void get_next (string T, int *nextValue){
	int length = T.length();
	int k = 1 ; 
	int value = -1;

	//nextValue[0] = -1 
	nextValue[0] = value;

	while(k < length){
		if (value == -1 || T[k] == T[value]) 
		{
			k++;
			value++;
			nextValue[k] = value;
		}else{
			value = nextValue[value];
		}
	}
} 

int main(){
	int next[20]={0};
	string s = "ababaaaba";
	get_next(s,next);
	for (int i=0;i<s.length();i++)
	{
		cout<<next[i]<<endl;
	}
	return 0;
}


理解记忆,有点乱.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值