一.BF算法
1.原理
暴力查找
逐个匹配主串字符,然后模式串j值回溯到1重新匹配
2.代码实现

二.KMP算法
1.原理
核心是避免不必要的回溯
问题是由模式串决定,不是目标串决定
只需要将j值模式串中j的位置回溯到next[j]位,而免除了前面不需要的匹配,以此来换取时间
2.难点拆解
①前后缀

②推导next数组
利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置

next数组:当模式匹配T失败时,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配
有点像递归,自己调动自己,当前面失配的时候,j就在失配的地方回溯,因而j = next[j]

3.代码实现
4.KMP算法改进
一个例子:
主串s=“aaaaabaaaaac”
子串t=“aaaaac”
这个例子中当‘b’与‘c’不匹配时应该‘b’与’c’前一位的‘a’比,这显然是不匹配的。'c’前的’a’回溯后的字符依然是‘a’。
我们知道没有必要再将‘b’与‘a’比对了,因为回溯后的字符和原字符是相同的,原字符不匹配,回溯后的字符自然不可能匹配。但是KMP算法中依然会将‘b’与回溯到的‘a’进行比对。这就是我们可以改进的地方了。
KMP算法的改进可以简述为: 如果a位字符与它next值指向的b位字符相等,则该a位的next就指向b位的next值,如果不等,则该a位的next值就是它自己a位的next值。

BF算法及KMP算法相关推荐

  1. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  2. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  3. 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。

    目   录 题目: 百度文库-答案: (1) (2) MOOC标准答案: (1) (2) mooc答案-截图: 数据结构(C语言版)-严蔚敏2007 题目: 设字符串S='aabaabaabaac', ...

  4. 模式串匹配的BF算法和KMP算法

    KMP是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的.为了解决模式匹配问题,也即寻找模式串(子串)在主串中第一次出现的位置,若模式串在主串中不存在则返回-1. 简单 ...

  5. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  6. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

  7. 数据结构之字符串匹配算法(BF算法和KMP算法)

    字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,. 在这里我 们讨论的时候主要用字符串来举例实现. ...

  8. BF算法与KMP算法详解

    目录 一.前言 二.BF算法 代码: 三.KMP算法 next数组: 关于为什么要找最长匹配前后缀: 代码: KMP: 代码: 三.代码汇总: 一.前言 说到字符串匹配,就不得不提BF算法和KMP算法 ...

  9. 数据结构与算法之KMP算法

    数据结构与算法之KMP算法 目录 KMP算法介绍 输入字符串str1,str2,返回字符串str2是否在str1中,在的话在第几位开始 1. KMP算法介绍 在CSDN上看到一篇写的很好的关于KMP的 ...

  10. 图解算法:KMP算法

    目录 第一章 暴力匹配实现 第二章 KMP算法介绍 第三章 KMP算法原理 第四章 KMP的匹配表 第五章 KMP算法实现 项目地址:https://gitee.com/caochenlei/algo ...

最新文章

  1. Python 库突发 PyPI 危机!
  2. 在OSX上安装Erlang
  3. 机器学习入门学习资源
  4. 转置与变换(Transposes and Permutation)
  5. 表格状态列_不用软件也能做好多个项目跟进管理?我用一个协同表格就搞定
  6. c++全局变量怎么定义_C errno全局变量是否是线程安全的
  7. c语言教程苏小红,《数据结构(C语言)》苏小红 课本案例
  8. 关于PredicateT委托
  9. [原]linux 修改 hostname 立即生效
  10. 线程并行化的概念及其用法
  11. Spring之AOP理解
  12. vmware虚拟机的基础使用
  13. 工作找了很多,兜兜转转,就是没遇到合适的,怎么办
  14. 如何手动释放Python的内存
  15. python中模块和包是什么_python的模块和包的详细说明
  16. 刚刚,云之家、聚美、中公教育等120款APP侵害用户权益被点名
  17. Android4.2 Quectel EC20 R2.1模块移植
  18. cisco 2821 路由器的端口映射
  19. 优达数据分析课程免费分享
  20. matlab 鼠标事件,MATLAB鼠标事件应用(记录)

热门文章

  1. Python—网络编程_Mail
  2. 程序员如何保护自己的颈椎?颈椎操
  3. 深入理解 Java 中的转义符: \u000a\u0022
  4. u盾如何在计算机上使用方法,u盾在电脑中具体使用操作过程
  5. 蓝牙电话之HFP-连接
  6. aName:array[0..31] of WideChar;//编译提示检测到错误类EAccessViolation//没有初始化
  7. linux2T硬盘分区命令,linux系统使用parted命令对大于2T的硬盘进行分区教程
  8. 多次进行hdfs namenode -format命令时,启动DataNode自动死亡的原因
  9. unity3d 角色 武器 动画 和 blender 工作流
  10. 现代战争——僵尸网络的历史 上篇