当前位置: 首页 > news >正文

【BF算法】

BF 算法

  • BF 算法精讲

在学习到字符串的匹配问题时,了解到了BF算法和KMP算法。
对比这两个算法,先了解BF算法;

字符串匹配问题,比如说:有一个主串 “abbbcdef” , 子串 “bbc”,该问题就是在主串中查找子串。

肉眼可见,主串中的确存在子串bbc,返回值是子串在主串中第一次出现的首位置下标,也就是返回2.

BF

首先来看一下下图

在这里插入图片描述
以上面的例子为例:
i指向位置和j所指向位置不相等,那么i就往后移一位
如下图:
在这里插入图片描述
此时i 和 j 所指位置相等,相等,i 和 j 都后移一位。再比较,相等,继续后移,此时到了下图的位置:
在这里插入图片描述
在这个地方不再相等了,所以 j 应该回退到初始位置,那么 i 应该回退到哪里呢 ? 其实很简单, i 和 j 是一起移动的, j 移动了多少位,i 就移动多少位 ,所以 i 回退的位置应该是 i - j +1
i = i - j +1 ,i - j 是 i 和 j 一起移动的长度,再 +1,就是i 从 开始的位置往后移了一位。
如下图:
在这里插入图片描述
从该位置再继续开始匹配, 第一次相同,第二次也相同,第三次也相同,这个过程就是

if (str[i] == sub[j]) str是主串,sub是子串
{
	i++;
	j++;
}

当j移动到 '\0’的位置时,表明已经匹配成功,
如下图:

在这里插入图片描述
匹配成功,则返回 子串在主串中第一次出现的起始位置
也就是 return i - j;

到了这里 , BF 算法的核心就结束了

BF算法其实就是一个个地往下匹配,不相等时主串的 i 走到下一位,子串回到初始位置,也就是朴素的匹配算法。

下面看代码:

int BF(const char* str, const char* sub)
{
	assert(str && sub);
	int i = 0;//记录主串
	int j = 0;//记录子串
	size_t len_dest = strlen(str);//strlen 返回值是size_t
	size_t len_src = strlen(sub);
	if (len_src == 0)
	{
		return 0;//子串为空,返回主串起始位置
	}
	while (i<len_dest)
	{
		while (str[i] == sub[j])
		{     
			i++;
			j++;
		}
		if (j >= len_src )// 子串到了'\0'位置了
		{
			return i - j;//找到了
		}
		//不相等就往下继续匹配
		i = i - j + 1;
		j = 0;
	}
	//退出该循环,说明找完主串都找不到,不存在该子串
	return -1;
}

int main()
{
	printf("%d\n", BF("abbbcdef", "bbc"));
	printf("%d\n", BF("abbbcdef", "bcd"));
	printf("%d\n", BF("abcdef", ""));
	return 0;
}

核心部分已做注释:

结果如下:
在这里插入图片描述

相关文章:

  • 多线程与高并发(三)
  • 【Spring(二)】IoC入门案例(XML版)
  • 剑指offer----C语言版----第一天
  • 量子计算(十八):量子计算机
  • c语言操作符(上)
  • 计算机基础知识(基础入门小白专属)五
  • Python实现模拟退火算法
  • 失业之后,我都干了啥
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • 知识付费海哥:知识变现三剑客
  • synchronized原理剖析与优化视频教程
  • 马上又是新的一年了 “跨年倒计时”送给大家
  • 【Flask框架】——28 Flask_SQLAlchemy
  • Debian系列-开机启动程序
  • Redis中的哨兵机制
  • Angular数据绑定机制
  • ESLint简单操作
  • Golang-长连接-状态推送
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Markdown 语法简单说明
  • Nacos系列:Nacos的Java SDK使用
  • Node + FFmpeg 实现Canvas动画导出视频
  • Service Worker
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 服务器从安装到部署全过程(二)
  • 回顾 Swift 多平台移植进度 #2
  • 面试总结JavaScript篇
  • 如何胜任知名企业的商业数据分析师?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我的业余项目总结
  • 移动端解决方案学习记录
  • 用mpvue开发微信小程序
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 走向全栈之MongoDB的使用
  • zabbix3.2监控linux磁盘IO
  • ​iOS实时查看App运行日志
  • ​Java并发新构件之Exchanger
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #1015 : KMP算法
  • (0)Nginx 功能特性
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)springcloud实战之config配置中心
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Flask之特殊装饰器详解
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .Net 8.0 新的变化
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证