咳咳咳,这是看毛片算法的简单介绍
首推一个博客,这个博客很优秀,我的KMP算法就是从上面学来的——https://www.cnblogs.com/yjiyjige/p/3263858.html

算法思想

假设母串是BACAACAAADH,子串是ACAACAD,
当匹配到下图一步,指针i和j的位置明显不匹配了,

肿么办,按照暴力的办法应该是把指针i和j回溯到如下图的位置再比较

但是,我们发现这样时间复杂度就变得很不友好,
细心或者对KMP有接触的朋友应该注意到了其实可以不回溯这么远,
其实可以回溯到如下图的位置

为什么呢,因为在子串中存在前三个字符和接下来的三个字符相同,
这样,我们就可以保持i指针不变,将j指针回溯三个字符,然后接着继续进行匹配操作,
从这个例子可以看出子串中有可能存在和开头相等的子子串,式子表示如下
str.substring(0, k) = str.substring(m, n)
我们可以利用这个特性,减少已经匹配过的串尽量少的回溯
咳咳咳,先想清楚再看下面的,如果想不太明白,那也看看下面的,
下面的是重点,考试要考的
++++++++++++++++++++++++++华丽的分割线++++++++++++++++++++++++++++
弄明白KMP的主体思想思想之后,我们就开始关注怎么实现了,
首先先看一个例子,如果当出现如下匹配失败的时候

因为橙色区域的和黄色区域的已经确认匹配,并且存在相等的情况,
所以回溯的时候,可以保持指针i不变,将指针j回溯到黄色区域的开头那里,如下图

也就是下图

也就是回溯到的位置是下标为3的位置,从这个例子可以看出,
在母、子串匹配的时候,无论在哪个位置不匹配,都会存在一个回溯的值,
哪怕是第一个就不匹配,也可以回溯到-1的位置
下面那个就是对应位置回溯位置的数组
对于ACAACAD这个子串来说,其数组为

关于代码怎么实现的,这个目前比较流行的是我下面给出的代码,
这个代码有两个难点,一个是k = next[k],一个j–
结合我给的例子,慢慢揣摩就能明白,我抽象表达能力不太好,这里就不误导大家了,
大家也可以去看看我开头推荐的那个博客,ta写的挺详细的,但是我没看(主要是太笨了,不想看也看不懂),我都是看ta代码慢慢研究出来的

上代码

// 暴力匹配的算法,至于怎么暴力,反正就是暴力,不要在意这些细节嘛
public int indexOf(String origin, String subStr) {int result = -1;for (int i=0; i<origin.length()-subStr.length(); i++) {boolean matching = true;for (int j=0; j<subStr.length(); j++) {if (origin.charAt(i+j) != subStr.charAt(j)) {matching = false;break;}}if (matching) {result = i;break;}}return result;}
// KMP算法的实现
public int indexOf(String origin, String subStr) {int result = -1;int i, j;i = j = 0;int[] next = getNext(subStr);while (i < origin.length()) {// 相等的情况if (subStr.charAt(j) == origin.charAt(i)) {i++;j++;if (j == subStr.length()) {result = i - j;break;}} else {  // 不等的情况j = next[j];if (j == -1) {i++;j = 0;}}}return result;}// 获取next数组public int[] getNext(String str) {int[] next = new int[str.length()];int k = next[0] = -1;// 其它博客都是while循环,这里为了体现j--这个的功能,就不用while了for (int j=1; j<str.length(); j++) { if (-1 == k || str.charAt(j-1) == str.charAt(k)) {    // 第一次k不等于-1的时候是j=2的时候next[j] = ++k;} else {    // ACAACADHk = next[k];j--;    // 懂了这个就懂了整个算法}}return next;}

时间复杂度

O(m+n)

这个博主很懒,就写了这么多,并且博主智商捉急,肿么办,挺急的单就不在线等了,忙着找药,有事留言

KMP算法——俗称看毛片算法相关推荐

  1. 每日算法练习——模式匹配KMP算法(看毛片算法?)

    知识补充: 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来 ...

  2. KMP 看毛片算法原理及其实现

    kmp算法 前言: 如何匹配字符串??? 一. 暴力匹配字符串 1.1 暴力算法描述 1.2 暴力算法实现 二. KMP算法 匹配字符串 2.1 三个概念: 最长前缀; 最长后缀; 最长公共前后缀? ...

  3. 王道数据结构课代表 - 考研数据结构 第四章 串-KMP(看毛片算法) 究极精华总结笔记(C版本)

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 串 章节知识点总结的十分全面,涵括了<王道数据结构 ...

  4. [看毛片算法][KM]zoj 3615:Choir II

    大致题意:     有n个男生,m个女生,每个人用一句话描述其他的异性.对与第i个人和第j个异性,其好感值为其姓名第一次出现的位置和出现次数的乘积.现在要匹配这些人,使得总的好感值之和最大,求这个值. ...

  5. 数据结构与算法?看这篇就够了!!!

    程序 = 数据结构 + 算法 --图灵奖得主,计算机科学家N.Wirth(沃斯) 作为程序员,我们做机器学习也好,做Python开发也好,Java开发也好. 有一种对所有程序员无一例外的刚需 -- 算 ...

  6. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  7. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) -- 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  8. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)

    本文引自图灵教育<算法图解> 你一定能看懂的算法基础书:代码示例基于Python:400多个示意图,生动介绍算法执行过程:展示不同算法在性能方面的优缺点:教会你用常见算法解决每天面临的实际 ...

  9. 从 Kafka 看时间轮算法设计

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7047405443961847816 前言 Kafka 中有很多延时操作,比如 ...

最新文章

  1. SAP PM纠正维护
  2. Java 集合系列(三)Collection 接口
  3. 覃超-算法训练营 学习方法分享[1] 如何精通一个领域
  4. 如何在 PyFlink 1.10 中自定义 Python UDF?
  5. Linux shell内核使用
  6. Samba配置文件常用参数详解
  7. 简单使用Idea创建三层架构项目和数据库连接(使用原生ajax进行访问+ajax)
  8. 《PIC微控制器项目设计:C语言》一导读
  9. GB35114-SIP部分技术预研
  10. Android 跟 ios 测试有什么区别
  11. HLS视频流 H265解码问题处理
  12. 下载维基百科wikipedia!
  13. 离散数学复习笔记——命题逻辑——命题
  14. Kria K26 SOM 在 KV260 开发板上的使用
  15. JavaScript+css实现的喜庆活动邀请函多页面html源码
  16. 基于MATLAB的变长信源编码算法的性能比较
  17. 微信改版,“内容+服务”成为王道?
  18. MII与RMII接口的区别
  19. VS2019与fluter通过MethodChannel进行双向通信(原创)
  20. 词袋模型和空间金字塔模型

热门文章

  1. android中留言板功能,js 实现简易留言板功能
  2. 耀华YHL-5屏幕开发教程
  3. servser 2008 web服务器 tcp响应慢,windows-server-2008 – 不明原因的慢速千兆网络速度...
  4. 老罗的「聊天宝」是不是死了 ?
  5. 对摩尔定律的理解。摩尔定律当前还是继续有效吗?
  6. 【CC评网】2013.第41周 不求排版,简单就好
  7. 实例004 计算正方形的周长
  8. Win11右下角时间怎么显示星期几?
  9. office 字体大小选择,没有 一号二号等中文字体
  10. 九阴白骨爪(2)Ubuntu20.04下配置环境(MySQL/Anaconda/Django)