c语言KMP算法实现

本文介绍了KMP算法如何避免暴力匹配中的回溯,通过构建next数组优化匹配过程,提高效率。并给出了C语言实现的代码示例。
摘要由CSDN通过智能技术生成

传统暴力求解匹配失败需要不停回溯主串,导致时间复杂度较高,而KMP算法不用回主串,只需要回溯子串,当匹配成功则返回子串在主串中的起始位置,否则返回空指针。

列如有以下两个串:

ABAABABBCBABABCA(主串)

ABABC(子串)

首先得算出每次子串能跳过几个字符,并放进next数组,next数组是通过推算共同的并且是最长的前后缀,匹配失败时应该找更小的前后缀防止有其他匹配成功的可能性。

完整代码如下
 

char* KMP(const char* dest, const char* scr)
{
	int len = strlen(scr);//计算字串长度
	int* next = (int*)malloc(static_cast<size_t>(len) * 4);//计算next数组所需要空间
	//memset(next, 0, 12);
	//int next[4] = { 0,1,0,1 };
	int i = 1, j = 0;//数组下标和共同前后缀长度
	next[0] = 0;//第一个始终为0
	while (i < len)//计算next数组
	{
		if (!(scr[j] - scr[i]))//判断是否有相同的前后缀
		{
			j++;
			next[i] = j;
			i++;
		}
		else
		{
			if (!j)//没有更短的前后缀
			{
				next[i] = 0;//直接设为0
				i++;
			}
			else
			{
				j = next[j - 1];//判断是否有更短的前后缀
			}
		}
	}
	//next[0] = 0, next[1] = 0, next[2] = 1, next[3] = 2,
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值