KMP代码实现

void GeneratePrefix(const string& pattern, int* prefix)
{
	int length = pattern.size();
	prefix[1] = 0;
	int LOLP = 0;           //LOLP表示最长的前缀数组
	int NOCM;              //number of characters matched
	for(NOCM = 2; NOCM <= length; ++NOCM)
	{
		while(LOLP > 0 && pattern[NOCM-1] != pattern[LOLP])
			LOLP = prefix[LOLP];
		if(pattern[NOCM-1] == pattern[LOLP])
			++LOLP;
		prefix[NOCM] = LOLP;
	}
}

void KMPMatch(const string& pattern, const string& target)
{
	int size1 = pattern.size();
	int size2 = target.size();
	if(size1 > size2)
		return;
	
	int prefix[size1];
	GeneratePrefix(pattern, prefix);
	int NOCM = 0;
	for(int i = 0; i < size2; ++i)
	{
		while(NOCM > 0 && pattern[NOCM] != target[i])
			NOCM = prefix[NOCM];
		if(pattern[NOCM] == target[i])
			++NOCM;
			
		if(NOCM == size1)
		{
			cout << "Matched! The start index is:" << i-size1+1 << endl;
			NOCM = prefix[NOCM];
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值