贴上源代码:

#include<iostream>
using namespace std;
int BF(char S[],char T[])
{
int i,j;
i = j = 0;
while(S[i]!='\0'&&T[j]!='\0'){
if(S[i]==T[i]){
i++;
j++;
}
else{
j = 0;
i = i-j+1;
}
}
if(T[j]=='\0')
return i -j+1;
else
return 0;
} int main()
{
//BF
cout<<BF("abcabcccc","abc"); return 0;
}

这是一种低效的模式匹配算法。叫做BF算法。

主要思想十分简单:

  • 给出两个字符串,分别为主串S和子串T,记下标为i,j。分别从第一个字符开始比较(即i=j=0)。当S[i]T[j]时,继续比较下一个;当S[i]!=T[j]时,j=0(重新从头开始比较子串),i的值赋为i-j+1。(关于为什么,我们接下来说)。如果S[i]'\0'了,证明主串比较完毕了,但是没有找到匹配的,即S不含有T,那么返回0;如果T[j]=='\0'了,证明子串比较完毕了,也就是主串S中含有子串T。此时返回子串T在主串S中出现的第一个字符的位置,即返回i-j+1

图示如下:

画图的时候两个串的最后都有‘\0’!!!!因为字符串的最后一位不是‘\0’么 但是我一个不小心忘了画了 也懒得改图了。。你们知道就行。。。。











此时S[i]!=T[j]

进行“回溯”。

子串从头开始比较,主串往后挪一位开始比较。



此时还是S[i]!=T[j]

进行“回溯”。

子串从头开始比较,主串往后挪一位开始比较



以此类推。。。。

即,

        if(S[i]==T[i]){
i++;
j++;
}
else{
j = 0;
i = i-j+1;
}

其中,i-j+1算的是i开头在的位置和j开头在的位置的差(即使i和j代表的字符相等时,同时++,也不会改变这个差)。再加上1就是再往后移一位。

依靠String实现的BF算法 C++


int BFstring(string MotherStr, string SonStr){
int i = 0, j = 0;
for(;(i != MotherStr.size()) && (j != SonStr.size());){
if(MotherStr[i] == SonStr[j]){
i++, j++;
}
else{
i = i - j + 1;
j = 0;
}
if(j == SonStr.size()){
return i - j + 1;
} }
return 0;
}

数据结构:BF算法的更多相关文章

  1. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

  2. 数据结构与算法JavaScript (四) 串(BF)

    串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的.线性表更关注的是单个元素的操作CURD,串则是关注查找子 ...

  3. 数据结构(三)串---BF算法(朴素模式匹配)

    (一)BF算法了解 BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法.BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T ...

  4. 数据结构19: BF算法(普通模式匹配算法)

    判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配. 在串的模式匹配过程,子串 T 通常被叫做“模式串”. 普通的模式匹配(“BF”算法) 判断两个串是否存在子串与主串的关系,最直接的算 ...

  5. 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)

    1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...

  6. 数据结构第二版之(课后题)BF算法病毒感染检测

    //vs2013下编译通过.换别的编译器自行补充头文件和修改源代码#include<iostream> #include<fstream> #include <strin ...

  7. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  8. 数据结构与算法--从平衡二叉树(AVL)到红黑树

    数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...

  9. 数据结构与算法(九):AVL树详细讲解

    数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希 ...

随机推荐

  1. docker 安装redis 注意事项

    一. redis配置文件修改(重要) ~/redis.conf 中daemonize=NO.非后台模式,如果为YES 会的导致 redis 无法启动,因为后台会导致docker无任务可做而退出. 三  ...

  2. Java 生成六位短信验证码

    在<Java 生成三位随机数>中,简要介绍了使用Java生成三位随机数的方法,前几天在工作中遇到生成6位短信验证码的需求,验证码由6位随机数字构成,不包含字母.6位随机数通常用作短信验证码 ...

  3. Go语言 之TCP文件传输

    服务端实现流程大致如下: 创建监听listener,程序结束时关闭. 阻塞等待客户端连接,程序结束时关闭conn. 读取客户端发送文件名.保存fileName. 回发“ok”给客户端做应答 封装函数 ...

  4. 攻防世界Hello,CTF writeup

    解题过程 首先在ida中进行反汇编,查看main函数的代码: 代码的的36行处进行了一个字符串比较,如果v10的值等于v13的值会反馈一个success的输出.v13的值在第15行给出,因此需要知道v ...

  5. html中如何获取元素在文档中的位置

    html中如何获取元素在文档中的位置 一.总结 一句话总结: $("#elem").offset().top $("#elem").offset().left ...

  6. 淘宝rem适配方案

    /*px 转化换 rem ,转化是 10 .比如:你的设计图为750,那么就 750 / 75 = 10 rem.设计图中你量尺寸都要除 75 就是 rem值.再比如量的设计图按钮宽度 66px,那么 ...

  7. ERS:百科

    ylbtech-ERS:百科 ERS=(Enterprises Run System)企业运行系统 企业运行系统-ERS,是继ERP系统之后的企业管理控制软件系统的终极形式,有着非常美好的市场前景,尤 ...

  8. eclipse 创建web项目,新建servelet实例

    参考: http://www.phperz.com/article/14/1127/38108.html http://jingyan.baidu.com/article/c843ea0b9aa914 ...

  9. Ubuntu16.04安装vmware pro 15激活码

    VMware Workstation Pro 15 激活许可证UY758-0RXEQ-M81WP-8ZM7Z-Y3HDAVF750-4MX5Q-488DQ-9WZE9-ZY2D6UU54R-FVD91 ...

  10. [C++]Yellow Cards - GYM - 102348A(Practice *) - CodeForces

    1 Problem Description Problem The final match of the Berland Football Cup has been held recently. Th ...