2019独角兽企业重金招聘Python工程师标准>>>

一、KMP算法思路启发2

      1.深入探讨算法思路

  • 这次我们给模式匹配串添加一个K数组(也就是KMP算法中非著名的next数组);
  • 这是一个"智能"的数组,因为他指导着模式匹配串下一步改用第几号元素去进行匹配。

      2.我们接着使用思路启发1中的案例,再添加next K数组的情况下,再来进行分析

      (1)思路启发一

如图所示,当字符串S与T进行匹配到i5,j5时,发现不匹配,此时第二轮的匹配就不需要回溯到i1,再从j1进行回溯匹配,只需要将匹配串T移动到j1,然后与i5进行匹配,这样就节省了回溯匹配的时间,提高了效率!

所以,j5对应的k值就为1,即表示匹配串T,下一步移动到j1,重新与串S的上一次匹配的位置进行匹配,即i1与j5进行匹配!

好,我们接着修改,假设原来串S的i4位置不为v而是c,那么就在i4,j4的位置就失配了,所以下一轮就是用j1去,所以k值即为1,依此类推,当j3与i3,j2与i2,j1与i1进行匹配的时候就失配了,则其对应的k值都为1,但是注意当地一个就失配的时候,j1的k值对应的是0,即移到字符串的开头,如下图所示:

      (2)思路启发二

如图所示,这个T串与S串的匹配,我们就不能按照前面的思路一了,因为当j3与i3失配时,按照思路一的方式,即把串T移动到j1的位置,然后与串S的i3位置进行匹配了!这样,我们就错过了i3与j2的匹配项,因为此时j2与i3是完全匹配的!为什么不能再采用思路一的方法呢,因为在j3失配之前,j1和j2是相等的,那么就需要特殊情况特殊考虑了!

按照思路一继续匹配:

按照思路二继续匹配,即T从j3移动到j2继续与i3匹配,即j3的k值为2:

如果匹配串T在j2与i2匹配时就失配,如下图所示,那么下一轮串T则移动到j1位置继续与i2进行匹配,那么j2对应的k值为1,j1对应的k值则为0,即移到开头重新匹配。

      (3)思路启发三

如下图所示,可以看到前面匹配有两个bb字串,所以当j6与i6失配的时候,i6的前缀为j1,j2,j3即为"bbs",而j6的后缀为j4,j5,j6即为"bbc",前缀与后缀匹配的个数有两个,所以就需要移动T串到j3的位置继续与串S的i6位置继续匹配,所以j6的k值为3;

如果串T在j5与i5匹配的时候就失配了,我们可以看到j5后缀就是j3,j4即"sb",前缀即为j1,j2即"bb",所以在j5失配时,前缀与后缀匹配的个数只有一个即为"b",所以,j5失配对应的下一轮匹配位置为2,即j5的k值为2;

由此,我们可以总结出一个规律,当前失配位置的下一轮匹配位置(即k值) = 当前适配位置的前缀和后缀的匹配个数 + 1

然后依此类推,可以很容易直到当在j4,j3,j2,j1失配对应的k值如下图所示:

      (4)思路启发四

通过上面的思路整理,我们看下面这个T串与S串匹配时,当在j5位置失配时,j5的后缀为j2,j3,j4即为"sss",j5的前缀为j1,j2,j3即为"sss",所以匹配的个数有3个,根据思路三总结的结论,我们知道j5位置失配对应的下一轮匹配的位置为j4,即k值为4;

依此类推,前面失配时对应的k值如下:

由此,我们可以再回味下"问题是由模式串决定的,而不是由目标串决定的"这句话时,是否就可以真正的体会到其内涵呢?

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

转载于:https://my.oschina.net/aibinxiao/blog/1850397

数据结构与算法之KMP算法02相关推荐

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

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

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

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

  3. 【数据结构】详解KMP算法

    字符串匹配算法:简单来说就是给你一个主串和一个子串,让你查找子串在主串中的位置,找到返回下标. 常见的两种算法:BF算法.KMP算法 这两种算法是怎样的思路呢,我们接着往下看: 目录 BF算法(暴力算 ...

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

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

  5. 图解算法:KMP算法

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

  6. 【C语言】算法学习·KMP算法

    KMP算法(全称Knuth-Morris-Pratt字符串查找算法,由三位发明者的姓氏命名)是可以在文本串s中快速查找模式串p的一种算法. 要想知道KMP算法是如何减少字符串查找的时间复杂度的,我们不 ...

  7. 数据结构 4 字符匹配-KMP算法

    第四章主要介绍的是串,但是串的实现没什么必要,最重要的知识点在于KMP算法的使用,大二时数据结构总结过一次KMP算法,大二时总结的比较细致,链接如下: https://blog.csdn.net/we ...

  8. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  9. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

最新文章

  1. 清华团队综述全面解读图神经网络理论方法与应用
  2. 大脑简史(2)-研究大脑的手段
  3. 使用抽象等设计工具创建一个稳固的核心机制
  4. ecshop 2.7.x 去版权 lengze.com
  5. 数据库中的范式和反范式详解!
  6. php批量生成html文件,php 批量生成html、txt文件
  7. java多参方法_Java中多参数方法进阶
  8. 【Python】pymysql模块处理Mysql数据库
  9. 渗透测试入门9之域渗透
  10. java类和对象:封装、继承和多态
  11. python字符串split()函数
  12. 约瑟夫环循环队列问题java_java 实现约瑟夫环
  13. 嵌入式系统那些事—脚本语言tcl
  14. multism中ui和uo应该怎么表示_Multisim中节点如何标记
  15. ❤️制作人工智能QQ机器人,视频教程+源码❤️内容超级丰富,慢慢看!
  16. javascript怎么定义类数组对象
  17. 心理学上的被动_心理学基本原理之二 : 主动与被动原理
  18. CocCocoa Touch框架和Cocoa
  19. 采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
  20. “全栈这个概念坑害了多少开发者

热门文章

  1. shell实例第9讲:判断用户输入的是否为IP地址
  2. C语言中()和【】的区别?
  3. 汇编(8086cpu): AX,BX,CX,DX寄存器
  4. Python学习教程(Python学习路线):Python3之递归函数简单示例
  5. @Componet @Resource Spring
  6. Ubuntu 16.04 GNOME在桌面左侧添加启动器(Launcher)
  7. 《数据库技术原理与应用教程(第2版)》——习 题 1
  8. 拟17.56亿控股江南集成 海陆重工加码光伏产业链
  9. SaaS服务在未来云计算中该如何发展
  10. how tomcat works 1 simple web server