萌新的看毛片(kmp)学习日记(下标从0开始)

本文介绍了KMP算法相较于BF算法的优势,KMP通过next数组避免了主串的回退,提高匹配效率。在理解KMP算法核心思想的基础上,详细解释了next数组的生成过程和作用,通过实例解析了next数组如何减少不必要的比较。
摘要由CSDN通过智能技术生成

bf匹配算法的思想是每次主串和模式串都从0开始匹配,当出现失匹的时候模式串将回退到起点,主串将回退到本次匹配起点的下一位置然后重新进行匹配,这样的匹配方式虽然好理解但是时间复杂度比较高,而kmp每次出现失匹的情况只有模式串回退,主串不回退,如果当前失匹点的位置为s[i],并且前k个元素和从头往后数k个元素匹配(即:"s[0]s[1]s[2]…s[k-1] = "s[i-k].....s[i-1]"),那么主串从上一位置一直往前k个元素和s[0]到s[k--1]肯定是匹配的,所以只需要比较当前位置和模式串的k位置是否匹配就可以了.

 

 

/*
	a为主串,b为模式串,n为主串长度,m为模式串长度,从主串的第pos位置开始往后比较
*/
int kmp(char a[], char b[], int n, int m, int pos)
{
	int i = pos, j = 0;//将主串的初始位置指向pos位置,模式串从头开始比较
	while(i < n)
	{
		if(j == -1 || a[i] == b[j])//如果当前位置匹配,那么继续匹配下一位置;
		{
			/*
			j == -1的情况是如果上次在某位置失匹并且模式串中没有一个k位置使得模式串中当前位置的前k个位置和从头开始k个位置相匹配
			那么就让j回退到-1直接从主串的下一个点和模式串的第一个点进行匹配
			*/
			++i;
			++j;
		}
		else
			j = next[j];//如果失匹模式串回退到k位置继续进行匹配(即:next[j]位置)
		if(j >= m)//如果j匹配
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值