KMP算法

学习指南

帮你把KMP算法学个通透!B站(理论篇)

帮你把KMP算法学个通透!(求next数组代码篇)

理论支撑:在找目标子串过程中,为了减少每次查找完都从开头重新查找的时间,KMP算法被开发出来,旨在减少冗余查找,每次查找失败回溯到最节约查找时间的位置。

原理

上图中能看到,遍历到文本及模式的第五个字符(从0开始算)时字符不匹配,但模式串的指针不会回到第一个字符,而是来到与文本串字符‘b’相同的下标2处,继续进行下一个字符的比较。

方法

第一步:

得到next数组,next数组的作用,就是利用最长前后缀找到具有部分相同前缀的字符之间的联系。tip:当前字符利用的是前一个字符的前缀表,前缀表中储存的是有联系字符的下标。

上图中,可以在前缀表中看到,与‘f’有联系的字符是下标为2的‘b’,而0代表的是不存在有联系的字符,此时模式串的指针直接回到下标0的位置

代码如下:

def getNext(self, needle: str, m: int):j = 0next = [0]*mnext[0] = jfor i in range(1, m):while j > 0 and needle[j] != needle[i]:j = next[j - 1]if needle[i] == needle[j]:j += 1next[i] = jreturn next

第二步:

利用前缀表(next)数组在文本串中找到模式串:

若字符匹配,则模式串指针向前直到末尾

若字符不匹配,则进行前缀表查询,期间进行指针移动,移动到指针所指的模式串字符与文本串相同或下标为0为止

代码如下:

def strStr(self, haystack: str, needle: str) -> int:m =  len(needle)next = self.getNext(needle, m)print(next)i = 0for j, x in enumerate(haystack):if x == needle[i]:i += 1if i == m:return j - m + 1else:while i > 0 and x != needle[i]:i = next[i - 1]if x == needle[i]:i += 1return -1

本题代码所使用的是28.找出字符串中第一个匹配项的下标

总结:

        这是我第一次学习KMP算法,文笔粗糙稍显难懂,如有不对还请指出,希望我们能从本次学习中收获更多。

代码随想录算法训练营第九天相关推荐

  1. 代码随想录算法训练营day1

    代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...

  2. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  3. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  4. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  5. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

  6. _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...

  7. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  8. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  9. 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

    代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...

最新文章

  1. AutoML大提速,谷歌开源自动化寻找最优ML模型新平台
  2. 卧底各大程序员圈,才知道什么才是牛逼的程序员!
  3. 使用 MQTTnet 快速实现 MQTT 通信
  4. 深度学习之 FPN (Feature Pyramid Networks)
  5. 计算机主机核心通常包括,计算机一级考试题库选择题
  6. 如何快速搭建云原生企业级数据湖架构及实践分享
  7. PTA 程序设计天梯赛(81~100题)
  8. Postman都脱单了,我决定用他女朋友Postwoman了
  9. sql server express 2005下载地址
  10. honeywell1900扫描枪的使用说明
  11. 电脑常用快捷键和操作你值得拥有!
  12. 阿里云服务器为何价格比较贵?
  13. SQL 限定返回行数
  14. 双软认证企业税收优惠政策
  15. 基于AVX256指令集和多线程优化的双机计算加速程序
  16. exfat fat_正确的名称是exFAT还是FAT64?
  17. 黄健翔昨天在意大利对澳大利亚的比赛上的解说激情四射
  18. matlab adaboost工具箱,GML_AdaBoost_Matlab_Toolbox
  19. visio 2007:方向键无法移动图像解决方法
  20. 第一篇 javase时钟表

热门文章

  1. 记录 - Dubbo使用Zookeeper为注册中心添加认证口令时,连接失败的故障
  2. 王道计算机网络 第一章 计算机网络
  3. 知识分享 | Oracle的官方ACE是个啥 and如何搞定一个ACE!
  4. c语言程序设计作业电话簿,C语言设计简易电话簿
  5. 域名备案、服务器备案和网站备案有什么区别?
  6. word快捷键被占用
  7. Linux内核深入理解定时器和时间管理(6):x86_64 相关的时钟源(kvm-clock,tsc,acpi_pm,hpet)
  8. python取出数组大于某值_计算矩阵中大于某个值的所有值
  9. 【软件群英会】QQ群 12月1日晚上聊天记录
  10. fr4速度 微带线_微带线和带状线(microstrip and stripline)