代码随想录算法训练营第九天
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算法,文笔粗糙稍显难懂,如有不对还请指出,希望我们能从本次学习中收获更多。
代码随想录算法训练营第九天相关推荐
- 代码随想录算法训练营day1
代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...
- 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...
- 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...
- _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II
_42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...
- _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II
_28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...
- _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树
_32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...
- 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独
代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...
最新文章
- AutoML大提速,谷歌开源自动化寻找最优ML模型新平台
- 卧底各大程序员圈,才知道什么才是牛逼的程序员!
- 使用 MQTTnet 快速实现 MQTT 通信
- 深度学习之 FPN (Feature Pyramid Networks)
- 计算机主机核心通常包括,计算机一级考试题库选择题
- 如何快速搭建云原生企业级数据湖架构及实践分享
- PTA 程序设计天梯赛(81~100题)
- Postman都脱单了,我决定用他女朋友Postwoman了
- sql server express 2005下载地址
- honeywell1900扫描枪的使用说明
- 电脑常用快捷键和操作你值得拥有!
- 阿里云服务器为何价格比较贵?
- SQL 限定返回行数
- 双软认证企业税收优惠政策
- 基于AVX256指令集和多线程优化的双机计算加速程序
- exfat fat_正确的名称是exFAT还是FAT64?
- 黄健翔昨天在意大利对澳大利亚的比赛上的解说激情四射
- matlab adaboost工具箱,GML_AdaBoost_Matlab_Toolbox
- visio 2007:方向键无法移动图像解决方法
- 第一篇 javase时钟表
热门文章
- 记录 - Dubbo使用Zookeeper为注册中心添加认证口令时,连接失败的故障
- 王道计算机网络 第一章 计算机网络
- 知识分享 | Oracle的官方ACE是个啥 and如何搞定一个ACE!
- c语言程序设计作业电话簿,C语言设计简易电话簿
- 域名备案、服务器备案和网站备案有什么区别?
- word快捷键被占用
- Linux内核深入理解定时器和时间管理(6):x86_64 相关的时钟源(kvm-clock,tsc,acpi_pm,hpet)
- python取出数组大于某值_计算矩阵中大于某个值的所有值
- 【软件群英会】QQ群 12月1日晚上聊天记录
- fr4速度 微带线_微带线和带状线(microstrip and stripline)