代码随想录 Day 9 | 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串、字符串总结 、双指针回顾

Day9 字符串part02 KMP的精髓是如果f和目标串没有匹配,那就看它的前一个字符的最长公共前后缀长度,因为他前面的字符是匹配成功的,可以不用再匹配了,我们找到最长公共前后缀长度,就相当于模式串的这个前缀也是匹配成功的,不用再匹配了。就这样节省了 时间。因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。 阅读详情

一、151.翻转字符串里的单词

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。

题目链接/文章讲解/视频讲解:代码随想录

1. 看完代码随想录的想法

法1:定义翻转函数+另开新数组+剔除空格+双指针翻转单词       

 总体思路:注意翻转单词和翻转字符并不一样,此处还需要剔除多余空格,保留两两单词之间的唯一空格。首先,可以将整个字符串全部反转一次,然后再将各个单词的字符串进行翻转;其次,使用双指针法进行空格剔除,快指针用于遍历整个字符串,慢指针用于存放不等于空格的字符,并且需要在每个单词之间增加一个空格。

(1)首先定义一个函数single_reverse,用于给定一个字符串以及指定的头和尾,将这个字符串的指定位置进行翻转;

(2)接下来定义主函数:首先另开一个新字符串,用于存放最终结果;定义一个指针初始化指向索引为0处;然后使用list()将给定的字符串强制转化为列表形式,方便进行遍历取值;最后使用reverse库函数将这个字符串列表进行整体全部翻转;

(3)接下来删除多余空格:首先指针遍历整个字符串列表(while fast < len(s):),如果该位置不是空格则进入下一步,如果是空格则指针继续指向下一个位置,直到该位置不是空格;如果该位置不是空格,我们需要添加一个判断,如果这个单词是结果集的第一个单词,那么不需要添加空格,因为第一个单词前面不需要空格;接下来我们需要将这个非空格位置对应的值存放进结果集result中,并且继续向下遍历,直到一个单词全部写入结果集;进入下一个循环后结果集里会添加一个空格,这样就满足了每个单词之间只有一个空格;

(4)最后我们需要调用最开始定义的翻转指定位置的字符串,对每个单词进行翻转;初始化快慢指针均指向0;然后将结果集字符串转化为列表;同样的以空格为界,快指针去遍历整个结果集字符串,遇到空格就判断前为同一单词的字符,并调用函数将其翻转;下一次循环需要将慢指针指向快指针+1处,快指针向后移动一位即可;

(5)最后之间拼接反转后的单词。

class Solution:
    def single_reverse(self, s, start: int, end: int):
        while start < end:
            s[start], s[end] = s[end], s[start]
            start += 1
            end -= 1

    def reverseWords(self, s: str) -> str:
        result = ""
        fast = 0
        # 1. 首先将原字符串反转并且除掉空格, 并且加入到新的字符串当中
        # 由于Python字符串的不可变性,因此只能转换为列表进行处理
        s = list(s)
        s.reverse()
        while fast < len(s):
            if s[fast] != " ":
                if len(result) != 0:
                    result += " "
                while s[fast] != " " and fast < len(s):
                    result += s[fast]
                    fast += 1
            else:
                fast += 1
        # 2.其次将每个单词进行翻转操作
        slow = 0
        fast = 0
        result = list(result)
        while fast <= len(result):
            if fast == len(result) or result[fast] == " ":
                self.single_reverse(result, slow, fast - 1)
                slow = fast + 1
                fast += 1
            else:
                fast += 1

        return "".join(result)

双指针法:

(1)首先使用split函数将字符串拆分成字符串列表,默认为按空格进行拆分;

(2)定义左指针和右指针,分别指向每个字符串列表的头和尾,并将每个单词进行翻转;

(3)最后返回用join函数以空格“ ”进行连接。

class Solution:
    def reverseWords(self, s: str) -> str:
        words = s.split()
        
        left = 0
        right = len(words) - 1
        while left < right:
            mid = words[left]
            words[left] = words[right]
            words[right] = mid
            
            left += 1
            right -= 1
        
        return " ".join(words)

2、遇到的困难及解决

(1)需要特别注意:空格" "引号里面需要空格,而不是习惯性直接写引号!

(2)split()函数:split函数传入的是字符串,输出的是字符串列表。

二、卡码网:55.右旋转字符串

建议:题解中的解法如果没接触过的话,应该会想不到

题目链接/文章讲解: 右旋转

1. 看到本题的第一想法

        首先使用list函数将字符串转化为字符串列表;然后如果想将倒数第n个元素移动到整个数组的最前面,那么不可避免每次挪动一个元素,都需要使用循环遍历将前面的元素依次向后移动,实现起来非常困难。

2. 看完代码随想录的想法

        首先对字符串数组进行切片,然后再进行拼接。

s=int(input())
k=input()

s=s[len(s)-k:] + s[:len(s)-k]

print(s)

三、28. 实现 strStr()

因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。

或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。

因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。

题目链接/文章讲解/视频讲解:代码随想录

本题是KMP 经典题目。以下文字如果看不进去,可以看《代码随想录》算法视频公开课 (opens new window),相信结合视频再看本篇题解,更有助于大家对本题的理解。

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        return haystack.find(needle)

四、459.重复的子字符串

本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。

我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃

题目链接/文章讲解/视频讲解:代码随想录

1. 看完代码随想录的想法

        (1)判断输入的字符串长度是否合法,要求非空并且有子串,所以长度必须大于1,否则直接返回False;

        (2)接下来将两个字符串分别去掉头和尾并将它们拼接,如果使用find函数还能在拼接后的字符串找到原始字符串的话,就说明原字符串可以由它的子串反复构成;

        (3)最后返回bool类型的结果,如果可以就返回True,否则返回False。

class Solution:
    def repeatedSubstringPattern(self, s:str) -> bool:
        if len(s) <= 1:
            return False

        ss = s[1:]+s[:-1]
        return ss.find(s)!=-1
       

2. 实现过程中遇到的困难及解决

(1)在定义函数时注意->表示最后返回的结果类型。

(2)find()函数:

五、字符串总结

题目链接/文章讲解: 代码随想录

 1. 字符串定义

字符串就是由多个字符组成的有限序列,也可以理解为字符数组。

2. 是否应该使用库函数

例如substr,split,reverse之类的库函数,如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数;如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

并且如果调用库函数,需要了解其实现原理以及时间复杂度。

六、双指针总结

此时我们已经做过10道双指针的题目了,总结一下双指针的心得

文章讲解:代码随想录

Vivado FIR Complier_IP核使用方法 文章依靠该IP核对应手册PG149写的,因为笔者需求简单,没有深入挖掘功能,可以自行下载学习。 阅读详情

相关推荐

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 256

代码随想录刷题day9丨151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(), 459.重复的子字符串,字符串总结,双指针回顾

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作针对数组删除操作的问题,使用双指针法进行移除操作当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章先整体反转再局部反转,实现了反转字符串里的单词先局部反转再整体反转可以达到左旋的效果"左旋"通常指的是将数组中的元素依次向左移动一个或多个位置,将移出的元素重新放到数组的末尾。KMP的主要思想是。

m0_75195038的博客 1117

用PyCharm+Scrapy打造你的第一个爬虫:从安装到实战(附完整代码)

本文详细介绍了如何使用PyCharm和Scrapy框架从零开始构建高效网络爬虫。通过环境配置、项目创建、核心爬虫逻辑编写到数据处理与存储的完整流程,帮助Python开发者快速掌握爬虫开发技巧,并附有实战代码示例。特别适合想要学习Scrapy框架和提升爬虫技能的开发者。

weixin_29038345的博客 868

代码随想录算法训练营day9|151.翻转字符串里的单词 ,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾

最近事情较多,博客中断了,每天还在刷题,博客陆续补上。

u010793461的博客 1036

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 412

Android Audio音量——音频类型新增(九)

在实际开发中,经常会遇到需要新增一个音频类型(usage)的需求,这里我们简单介绍一下需要修改的代码。

小旭的专栏 1570

二刷代码随想录训练营Day 9|151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾

代码随想录。

weixin_64434454的博客 513

PMP--工件

合同是指对双方都有约束力的协议,强制卖方提供规定的产品、服务或结果,以及强制买方支付相应的费用。它还可能包括处于中间状态的特性,例如已设计但尚未构建的特性、质量保证中的特性或测试中的特性。RACI 矩阵是一种常见的方法,用于显示执行、担责、咨询或知情,且与项目活动、决策和可交付物有关的干系人。计划是提议的实现某种目标的方式。在项目开始前或开始时创建的文件,涉及与项目有关的战略、商业或高层级的信息。或 © 它们是用特定方法创建的结果,例如,虽然成本估算结果是一个重要工件,它们是用不同估算方法得出的结果。

stqer的博客 1666

算法训练营day9 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串、字符串总结 、双指针回顾

算法训练营DAY9 字符串相关题目+KMP算法解析

m0_65111950的博客 1123

ESP32学习笔记06-UART 的485 通讯模式

通信方式选择UART 控制器支持多种通信模式,使用函数 uart_set_mode() 可以选择模式。选择特定模式后,UART 驱动程序将处理已连接 UART 设备的相应行为。例如,主机开始向 Tx FIFO 缓冲区写入数据时,UART 驱动程序会自动置位 RTS 管脚(逻辑 1);最后一位数据传输完成后,驱动程序就会取消置位 RTS 管脚(逻辑 0)。要使用此模式,软件。

Car12 2476

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

Studying-代码随想录训练营day9| 151.反转字符串里的单词、卡码网:55.右旋转字符串、28.实现strStr()、459.重复的子字符串、字符串总结、双指针回顾

151.反转字符串里的单词、卡码网:55.右旋转字符串、28.实现strStr()、459.重复的子字符串、字符串总结、双指针回顾

yachihaoteng的博客 1339

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

代码随想录算法训练营day9(python版)|第四章 字符串part02|●151.翻转字符串里的单词●卡码网:55.右旋转字符串●28. 实现 strStr()●459.重复的子字符串

151.翻转字符串里的单词建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。

qq_43752779的博客 980

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Leetcode刷题 | Day9_字符串02

给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1。示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2。解释: 可由子字符串 "ab" 重复两次构成。输入: "abcabcabcabc"

weixin_52152177的博客 1129

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

代码随想录算法训练营Day8 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾

little__penguin的博客 1130

day09-字符串part02-151.翻转字符串里的单词-卡码网:55.右旋转字符串-28. 实现 strStr()-459.重复的子字符串-字符串总结

Java字符串总结-优快云博客双指针回顾双指针法在数组,链表和字符串中很常用。

weixin_66095070的博客 611

代码随想录算法训练营day9 | 151.反转字符串里的单词、卡码网:55.右旋转字符串、卡码网:54.替换数字、KMP算法、28.实现 strStr()、459.重复的子字符串

代码随想录算法训练营day9 | 151.反转字符串里的单词、卡码网:55.右旋转字符串、卡码网:54.替换数字、KMP算法、28.实现 strStr()、459.重复的子字符串

m0_55763458的博客 927

Day9补代码随想录 151.翻转字符串里的单词|卡码网:55.右旋转字符串|28.实现 strStr()|459.重复的子字符串|字符串总结|双指针回顾

字符串String变为数组Char,再按照数组方法处理。返回字符串String,return new String(chars);三步去除多余空格双指针,两层if判断(将非空格的fast移动;slow预设一个空格除第一个元素外)两次if(chars[fast]!=’ ')的用法不同=’ '])跳过一些空格,直到遇到单词部分=’ ‘)//放一个单词后遇到空格就停止while循环清空数字多余的空间,提高内存效率chars是处理后的数组,长度为slow;//创建新数组。

爱因斯小柚的博客 939

day9 | 翻转字符串里的单词、右旋转字符串、实现 strStr()、重复的子字符串

用来将字符串转换为字符数组。toString()直接打印字符数组时会输出数组的内存地址,不会直接输出字符内容。为了输出字符数组内容,可以将其转换为字符串。异或法用于反转字符数组是一个巧妙的技巧,但实际开发中,可能更常用的是通过交换字符来反转数组。字符数组(char[])是一个由多个字符组成的数组。在 Java 中,char是一种基本数据类型,用于表示单个字符,例如字母、数字、符号等。字符数组是一个存储char类型元素的数组,可以包含多个字符。每个字符会占用两个字节,因为在 Java 中,char。

weixin_46053950的博客 676

代码随想录Day09 151.翻转字符串里的单词,55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结 ,双指针回顾 。

代码随想录Day09 151.翻转字符串里的单词,55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结 ,双指针回顾 。

get_money_的博客 952

算法训练营Day8 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串

151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾。双指针,两种方式,一种原地修改(适合可以修改字符串的语言),一种需要额外的空间O(n),搞清楚字符串的下标是难点。看了题解,得到的结论,原地实现字符串右移动,先反转整体(让右部分到字符串左边),再反转两部分,左移同理。

weixin_43678826的博客 419

代码随想录算法训练营第九天 | 151.反转字符串单词 | 卡码网:55.右旋转字符串 | 28. 实现 strStr() (KMP)| 459.重复的子字符串 (KMP)

自己实现中遇到哪些困难KMP 构造 next 数组KMP 字符串匹配今日收获,记录一下自己的学习时间解惑(补充)字符串总结字符串是字符数组熟悉库函数双指针反转字符串KMP(构造next数组,字符串匹配)代码随想录双指针回顾数组中移动元素字符串去出空格链表前后节点N数之和,降低一级复杂度代码随想录。

Noah_aa的博客 664

代码随想录 day 9 字符串

比较简单,大家读一遍就行。

weixin_45549711的博客 686

代码随想录算法训练营第九天 | 151. 翻转字符串里的单词、卡码网55. 右旋转字符串 28.实现strStr()、459.重复的子字符串、字符串总结、双指针总结

151. 反转字符串中的单词 - 力扣(LeetCode)卡码网55. 右旋转字符串28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)459. 重复的子字符串 - 力扣(LeetCode) 字符串总结双指针总结541. 反转字符串 II - 力扣(LeetCode) 18. 四数之和 - 力扣(LeetCode)25. K 个一组翻转链表 - 力扣(LeetCode) 148. 排序链表 - 力扣(LeetCode) 23. 合并 K 个升序链表 - 力扣(LeetCode) 146.

weixin_47495480的博客 320

菜鸟学算法day9-字符串2(Java)

如果不占用新的空间,可以先整体反转,再把前k个和后length-k个分别反转。(但在java中需要申请新的空间)本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。此时对原arr从后到前检查,对新arr从前到后填充。KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃。所以在每次复制中,实际长度是单词长度+1,需要在newArr中加入空格。459.重复的子字符串 (本题可以跳过),可以包含多个字符或空字符串。,只能包含一个字符。第二行读取一个字符串。

coffin_的博客 374

✅DAY9 字符串+KMP | 151.翻转字符串里的单词 | 卡码网:55.右旋转字符串 | 28. 实现 strStr() | 459.重复的子字符串 | 字符串总结 | 双指针回顾

小伙伴们共勉~

wshi10的博客 359
上一篇: 代码随想录 Day 8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字
下一篇: 代码随想录 Day 10 | 【第五章 栈与队列】 232.用栈实现队列 、225. 用队列实现栈 、20. 有效的括号 、1047. 删除字符串中的所有相邻重复项
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值