串的模式匹配算法 BF算法/KMP算法(字符串匹配)

BF算法:

比较移动的位置,每次都只移动一个位置

每次重新比较时,总字符串a[i]中下标i和将要比较字符串b[j]中下标j都会变化

i的变化情况,每次都到本次比较开始处的第二位

所以i=i-j+1(i现在的位置减去字符串中已经比较了j个字符就等于本次的开始位置,在加一即为第二位)

j直接每次过后直接到开头

所以j=0.

代码:

int BF(SString a, SString b, int pos)     //此处pos即为想要从第几个位置(数组位置)开始比较,上图都是从零开始,即pos=0
{
	pos = 0;
	int i = pos;
	int j = 0;
	while (i <= a.length && j <= b.length)
	{
		if (a[i] == b[i])
		{
			i++; j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}
	}
	if (j > b.length)
		return i - j;          //返回从数组a的第几个下标开始
	else    
		return 0;
}

KMP算法

与BF差不多,只不过返回时位置不是只移动一个位置

当进行下一次比较时,不再是直接i直接跳转到第二位,j变为0,浪费资源

而是进行比较跳转到适合的位置,即i直接不变,j根据自身调整j需要变化的位置

如图中第四步跳转的介绍

这个地方需要用到next和nextval的求法:以前我的思路错了,新的一篇博客专门讲ext和nextval求法

https://blog.csdn.net/qq_46423166/article/details/106932944

跳转代码:

int BF(SString a, SString b, int pos)
{
	pos = 0;
	int i = pos;
	int j = 0;
	while (i <= a.length && j <= b.length)
	{
		if (a[i] == b[i] || j == 0)
		{
			i++; j++;
		}
		else{
			j = next[j];
		}
	}
	if (j > b.length)
		return i - j;      //返回从数组a的第几个下标开始

	else
		return 0;
}

需要比较的数组的自身next[]算法

void returna(String a, int nextval[])
{
	int i = 1,j=0;
	nextval[1] = 0;
	while (i < a.length)
	{
         
        if(j==0 || a.ch[i]==a.ch[j])
        {
            i++;j++;
            if(a.ch[i] != a.ch[j])  nextval[i]=j;
            else   nextval[i]=nextval[j];
        }
        else   j=nextval[j];
	}
}

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大学生毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值