KMP算法和BF算法

(String)是由零个或多个任意字符组成的有限序列。如下图所示

目录

一、BF算法

二、KMP算法

一、前缀、后缀,最大公共前后缀

二、研究KMP与BF的区别 (主要是回溯)

三、next数组的讲解

j 位置的确定 (即next数组的详解)


当n=0时,为空串,与空格串不同。

 一个串中任意个连续字符组成的子序列(包含空串)成为该串的子串。子串的概念类似于数学中的集合,有真子串,如下图所示

 图来自于bilibili 王卓老师

具体初始化,创建等就不讲了,实际开发中不可默守陈规,关键在于学习两种算法

一、BF算法

此算法也称为简单匹配算法。实际上即是暴力穷举法,算法时间复杂度为O(n*m),为方便理解算法先看下面图解

 若刚开始S[0]!=T[0],条件同样满足,因此只要S[s]!=T[t],回溯就成立。循环此步骤的条件为s,t均小于该串长度

 当前面元素都满足条件S[s]==T[t],且进行到T[t]=="/0"时,代表匹配到了字符。此算法每次都要回溯因此时间复杂度为0(n*m)

代码实现如下(我以字符数组为例主要演示算法) 

char S[7] = {"abcacbb"};
	char T[4] = {"cacb"};
	int s = 0;
	int t=0;
	while (s<sizeof(S)&&t< sizeof(T)) {    //j范围在主串内,t范围在子串内
		if (S[s]==T[t]) {
			s++;
			t++;    //值相等则比较下一元素
		}
		else {
			s = s - t + 1;    //回溯子串主串
			t= 0;
		}
		if (T[t]=="/0") {
			return 1;        //找到了
		}
		else {
			return 0;       //还未到循环结束
		}	
	}

二、KMP算法

KMP算法主要是在回溯方面进行了优化,使得不至于傻瓜式的回溯到头,关键点在于找到最大前后缀以减少无谓的过程。

由于网上的讲法有很多,我这面主要拆分为完整过程next数组两部分讲解,我这面归纳总结为以下几个步骤:

KMP算法流程

①前缀,后缀,最大公共前后缀 概念 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序lee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值