代码随想录27期|Python|Day9|字符串总结|双指针总结|KMP初探(28. 实现 strStr()、 459.重复的子字符串)

字符串总结

字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。

双指针法是字符串处理的常客。

题目类型的总结可以看代码随想录(很全面)

字符串题目总结:代码随想录 (programmercarl.com)

双指针总结

题目总结可以看代码随想录,注意需要结合题目!不只是看方法论,特别是对于内存和时间要求高的。

代码随想录 (programmercarl.com)

KMP初探(较难,可以回头再看)

代码随想录讲解视频链接:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili

KMP算法是通过预处理模式串来构建一个匹配表 (next数组),然后在匹配时使用这个匹配表来快速地判断当前位置的字符是否匹配。它的时间复杂度是O(m+n),其中m是模式串的长度,n是文本串的长度。也就是说,KMP其实可以“保存已经匹配到的字符”,从而不需要每次都从头开始遍历。(图:代码随想录)

思路

根据KMP算法,我们大致分为以下几个步骤:

1、求解needle的next数组(或者有的人叫prelix数组);

2、按照next和haysatck匹配,如果完全通过,则ojbk;如果不是,则在needle中回退到现在的next数组的值对应的needle索引位置处,继续寻找。

求解相等前缀表next

那么什么是前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀和后缀。

前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

为什么用前缀表:因为我们现在只需要判断不匹配处所对应的前缀的最后的位置就可以继续在haysatck继续找了(因为这一部分是相同的,不需要从needle的头部开始)。

代码

暴力法

class Solution(object):def strStr(self, haystack, needle):""":type haystack: str:type needle: str:rtype: int"""# 暴力法m, n = len(haystack), len(needle)for i in range(m):if haystack[i: i + n] == needle:return ireturn -1

但是时间和内存居然很小(exm,r u kidding?)

next前缀表法

class Solution(object):# 前缀表next法,next储存当前位置包含的相等前后缀子串的数目def getnext(self, next, s):j = 0  # 找前缀的最后一个位置的指针next[0] = 0for i in range(1, len(s)):  # i作为遍历指针,从1开始while j > 0 and s[j] != s[i]:  # 当前后不相等,让j指向上一个next的位置j = next[j - 1]if s[i] == s[j]:  # 如果找到了相等的,更新j的个数j += 1next[i] = j  # 每走一次i,都要记录j的个数def strStr(self, haystack, needle):""":type haystack: str:type needle: str:rtype: int"""if len(needle) == 0:return 0  # 模拟实现C++的strStr函数返回空字符串的匹配结果next = [0] * len(needle)self.getnext(next, needle)j = 0# 查找的逻辑和查找前缀差不多for i in range(len(haystack)):while j > 0 and haystack[i] != needle[j]:j = next[j - 1]  # 匹配不一致,j回到上一个位置处next的值对应的needle的索引处if haystack[i] == needle[j]:j += 1  # 匹配正确,累计j的个数 if j == len(needle):  # j可以一直累积到needle的长度说明全部找到return i - len(needle) + 1return -1

移动匹配+find库函数

基本原理:将两个s相加如果仍出现一个完整的s,那么就是由重复子串组成。(图:代码随想录)

注意!!拼接之前需要分别去掉s的头部和尾部,不然在s+s里找到原始的s是没用滴~

class Solution(object):def repeatedSubstringPattern(self, s):""":type s: str:rtype: bool"""n = len(s)if n <= 0:return Falsess = s[1:] + s[:-1]  # 需要弃掉首尾return ss.find(s) >= 0

459. 重复的子字符串​​​​​​​

KMP法

这里有一个trick值得借鉴:

根据最大相等前后缀的概念,我们需要找的到前缀第一个值,一定在隔一段距离的后缀第一个值出现,也就意味着对应在原字符串中,开头出现的字符出现在了相隔一段距离之后;以此类推,此时原字符串中的元素对应在前缀串中,再被对应到后缀串中;也就意味着如果这个过程可以持续到字符串结束。

那么前缀和后缀中间差的这一段“没有对齐的字符串”,就会被不断投射到后面,形成了循环。那么我们只要知道,这样一个“没有对齐的字符串”的长度,能不能被原字符串的长度整除即可。

class Solution(object):def repeatedSubstringPattern(self, s):""":type s: str:rtype: bool"""next = [0]*len(s)self.getnext(next, s)if len(s) == 0:return 0# 判断最长的前缀串和总长度的差值是否可以背总长度整除if next[-1] != 0 and len(s) % (len(s) - next[-1]) == 0:return Truereturn False# KMPdef getnext(self, next, s):j = 0next[0] = 0for i in range(1, len(s)):# 回退while j > 0 and s[i] != s[j]:j = next[j - 1]# 更新if s[i] == s[j]:j += 1next[i] = jreturn next

 OMG第9天完结🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/266749.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【lesson11】数据类型之string类型

文章目录 数据类型分类string类型set类型测试 enum类型测试 string类型的内容查找找所有女生&#xff08;enum中&#xff09;找爱好有游泳的人&#xff08;set中&#xff09;找到爱好中有足球和篮球的人 数据类型分类 string类型 set类型 说明&#xff1a; set&#xff1a;集…

排序算法:【插入排序】

一、插入排序&#xff1a;时间复杂度、原地排序 原理&#xff1a;可以想象成打扑克牌时候&#xff0c;发到手里的牌&#xff0c;我们一张一张拿起来插到手里牌的适当位置。 将待排序列表的第一个元素看作是一个有序序列&#xff08;或叫有序区&#xff09;&#xff0c;然后从第…

ESP8266模块(CH340)零基础实战

USB数据线连接ESP8266模块到电脑 先按住FLASH键,再按一下RST键,然后松开 此时电脑可识别出CH340 COM接口 CH340芯片厂商网址: wch.cn 传输比特率9600 win11自带驱动 下载Arduino IDE

数据科学实践:探索数据驱动的决策

写在前面 你是否曾经困扰于如何从海量的数据中提取有价值的信息?你是否想过如何利用数据来指导你的决策,让你的决策更加科学和精确?如果你有这样的困扰和疑问,那么你来对了地方。这篇文章将引导你走进数据科学的世界,探索数据驱动的决策。 1.数据科学的基本原则 在我们…

现货黄金会面临哪些风险?

进行现货黄金投资&#xff0c;我们除了要了解怎么找到交易机会以外&#xff0c;也要知道我们交易会面临哪些风险&#xff0c;了解风险就是做到知己知彼&#xff0c;了解风险才能控制风险。控制住风险&#xff0c;才能为我们稳定盈利打好基础&#xff0c;那么下面我们就来看看在…

力扣108. 将有序数组转换为二叉搜索树(三种思路)

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 > 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5…

如何在Linux本地部署openGauss开源数据管理系统并结合内网穿透公网访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

AI:94-基于深度学习的微小目标检测与定位

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

decomposition-based multi-objective algorithm4SPDPTW

关键词 文章概述 研究背景 多目标选择性接送和配送问题&#xff08;PDPs&#xff09;&#xff1a;研究涉及多目标选择性接送和配送问题&#xff0c;这些问题传统上从单一目标角度进行探讨&#xff0c;以寻找最具盈利性的请求集合&#xff0c;同时遵守一系列限制条件。 经济和…

批量操作Excel的四个方法(求和、移动、对比、合并)

Excel文件肯定少不了保存大量数据&#xff0c;那么在使用excel的时候会不会要大批量数据进行操作&#xff1f;今天分享4个快速使用excel操作的小技巧。希望能够帮大家提高excel制作效率。 技巧一&#xff1a;快速求和 当你想要分别得到行列的总和&#xff0c;我们可以选中表格…

System 2 Attention:可以提高不同LLM问题的推理能力

推理正在成为大型语言模型(llm)关注的下一个主要领域。尽管llm拥有先进的能力&#xff0c;但大多数llm经常被简单的错误绊倒&#xff0c;显示出他们在推理方面的局限性。这些模型可能会被上下文中的不相关细节所误导&#xff0c;或者受到输入提示中的偏差的影响。而后一种倾向被…

openlayers-19-分屏对比

分屏对比实现很简单&#xff0c;定义两个map对象&#xff0c;然后让这两个map对象共用一个view即可。 代码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd…