【BF算法】

news/2025/3/31 22:59:31/

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_tsize_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;
}

核心部分已做注释:

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


http://www.ppmy.cn/news/7296.html

相关文章

JavaScript基础

一、JavaScript的介绍 JavaScript 是一种运行在 客户端的脚本语言&#xff0c;作为web标准的行为层&#xff0c;最初出现时只是为了实现网页端和用户之间的交互。在正式学习JS之前&#xff0c;我们首先需要对JS的产生和发展历史有一定的了解。 1. JS发展历史 1995年&#xf…

servlet(三)文件的下载

主要有几个步骤: 1、获取要下载的文件名 2、读取要下载的文件内容 (通过 ServletContext 对象可以读取,这个也是 ServletContext的应用) 3、获取要下载的文件类型 4、在回传前&#xff0c;通过响应头告诉客户端返回的数据类型 5、还要告诉客户端收到的数据是用于下载使用&#…

整合Kafka

Main Concepts 一些服务器形成了存储层&#xff0c;被称为broker&#xff0c;其他服务器运行kafka连接去不断地导入和导出数据作为事件流&#xff0c;将kafka和关系型数据库等存在的系统集成。 Servers: Kafka is run as a cluster of one or more servers that can span mult…

【工具类】后台Mock工具类

目录一、介绍二、使用方法1. Controller层定义接口2. 编写json文件3. 开启AOP4. 调用接口验证三、源码一、介绍 Controller层定义完接口后&#xff0c;不需要写业务逻辑。编写Json文件&#xff0c;调用接口时返回json文件的数据。 优点&#xff1a; 设计阶段即可定义好接口&…

写一个计算器【后缀表达式】(C++)

前言&#xff1a; 闲来无事&#xff0c; 用后缀表达式写了个计算器。。。 支持加()、减(-)、乘(*)、除(/)、乘方(^) 啥是后缀表达式&#xff1a; 波兰逻辑学家卢卡西维奇发明的表示表达式的方法 后缀式即逆波兰式&#xff0c;是波兰逻辑学家卢卡西维奇&#xff08;&#…

uTools V3.3.0 效率工具集

前言 uTools是一款基于electron开发的工具集软件&#xff0c;通过快捷唤醒搜索&#xff0c;直接打开各种功能&#xff0c;非常方便。 uTools uTools是一个极简、插件化、跨平台的现代化桌面软件。通过自由选配丰富的插件&#xff0c;打造你得心应手的工具集合。 通过快捷键…

Oracle数据库Date类型查询结果多出“.0“的解决方法

oracle设置数据库某张表的字段类型为date&#xff0c;数据库存值为 2019-11-25 18:51:47 格式&#xff0c;但是从数据库查询出来之后格式为 String stopTime map.get("stopTime").toString;2019-11-25 18:51:47.0 &#xff0c;多了个零&#xff0c;不知是毫秒还是…

企业活动如何邀请电视台媒体记者参加和报道

作为大众媒体&#xff0c;电视媒体具有极为广泛的受众群体。同时&#xff0c;它又极具权威性。在电视上播放的新闻报道和各类节目&#xff0c;都需要经过严格的审查和核实。因而电视媒体尤其是央视和各省级卫视电视台&#xff0c;和许多其他媒体相比&#xff0c;更受大众的信赖…