代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾

题目链接:28. 实现 strStr()

卡老师:本题是KMP 经典题目,因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。

卡老师所言极是,第一次接触,看着头大,先放过,先了解一下KMP算法是干啥的

KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。

下面放上卡老师文章讲解链接 :代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾_第1张图片https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html

视频链接:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili我已经陆续将算法专题整理成了pdf供大家学习,pdf中不仅有刷题大纲、刷题顺序,还有详细图解,每一本pdf发布之后都广受好评,在公众号「代码随想录」后台回复:333,就可以获取了,赶快下载看看吧!, 视频播放量 208520、弹幕量 1649、点赞数 8025、投硬币枚数 7426、收藏人数 3540、转发人数 674, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:帮你把KMP算法学个通透!(求next数组代码篇),最浅显易懂的 KMP 算法讲解,当程序员看到新手写的代码,KMP算法之求next数组代码讲解,学历低于“211”建议不要去做算法!,【搬运】油管阿三哥讲KMP查找算法,中英文字幕,人工翻译,简单易懂,【第15届中国计算机设计大赛】微课辅助类 省三 《一次学会KMP算法》,国内算法大佬左程云VS清华大佬马士兵:Leetcode刷题200道,足以吊打字节面试官!,KMP算法精讲(2)——什么是最长公共前后缀?,KMP字符串匹配算法1https://www.bilibili.com/video/BV1PD4y1o7nd/ 帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili我已经陆续将算法专题整理成了pdf供大家学习,pdf中不仅有刷题大纲、刷题顺序,还有详细图解,每一本pdf发布之后都广受好评,在公众号「代码随想录」后台回复:333,就可以获取了,赶快下载看看吧!, 视频播放量 167099、弹幕量 1484、点赞数 5112、投硬币枚数 4827、收藏人数 2113、转发人数 333, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:KMP算法之求next数组代码讲解,帮你把KMP算法学个通透!(理论篇),最浅显易懂的 KMP 算法讲解,KMP算法无脑求next和nextval数组,一看就会。(无原理,适用于无脑做题),KMP算法求next数组和nextval数组的过程,6.编写kmp算法代码,【数据结构】KMP算法•8分钟搞定求解next数组,KMP算法Next数组讲解,【天勤考研】KMP算法易懂版,KMP算法 看完就会 简单易懂https://www.bilibili.com/video/BV1M5411j7Xx

题目链接: 459.重复的子字符串

本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。 卡老师建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃。

卡老师文章讲解:代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾_第2张图片https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html视频链接:字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!代码随想录刷题网站:programmercarl.com, 视频播放量 34248、弹幕量 433、点赞数 608、投硬币枚数 423、收藏人数 124、转发人数 44, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:一道算法题理解滑动窗思想!【趣刷Leetcode】 No.3 无重复字符的最长子串,LeetCode 最热门 100 题,看清华学神尹成排名leetcode全站第一,#19 leetcode 459. 重复的子字符串,贪心算法理论基础!,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,【LeetCode 每日一题】3. 无重复字符的最长子串 | 手写图解版思路 + 代码讲解,带你学透回溯算法-分割回文串(对应力扣题目:131.分割回文串)| 回溯法精讲!,单调队列正式登场!| LeetCode:239. 滑动窗口最大值,带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?https://www.bilibili.com/video/BV1cg41127fw

字符串总结

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组。

要不要使用库函数

在文章344.反转字符串 (opens new window)中强调了打基础的时候,不要太迷恋于库函数。

甚至一些同学习惯于调用substr,split,reverse之类的库函数,却不知道其实现原理,也不知道其时间复杂度,这样实现出来的代码,如果在面试现场,面试官问:“分析其时间复杂度”的话,一定会一脸懵逼!

所以建议如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。

如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

双指针法

在344.反转字符串 (opens new window),我们使用双指针法实现了反转字符串的操作,双指针法在数组,链表和字符串中很常用。

接着在字符串:替换空格 (opens new window),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

那么针对数组删除操作的问题,其实在27. 移除元素 (opens new window)中就已经提到了使用双指针法进行移除操作。

同样的道理在151.翻转字符串里的单词 (opens new window)中我们使用O(n)的时间复杂度,完成了删除冗余空格。

一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。

反转系列

在反转上还可以在加一些玩法,其实考察的是对代码的掌控能力。

541. 反转字符串II (opens new window)中,一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。

其实当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章

只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多。

在151.翻转字符串里的单词 (opens new window)中要求翻转字符串里的单词,这道题目可以说是综合考察了字符串的多种操作。是考察字符串的好题。

这道题目通过 先整体反转再局部反转,实现了反转字符串里的单词。

后来发现反转字符串还有一个牛逼的用处,就是达到左旋的效果。

在字符串:反转个字符串还有这个用处? (opens new window)中,我们通过先局部反转再整体反转达到了左旋的效果。

KMP

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

KMP的精髓所在就是前缀表,在KMP精讲 (opens new window)中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。

前缀表:起始位置到下标i之前(包括i)的子串中,有多大长度的相同前缀后缀。

那么使用KMP可以解决两类经典问题:

  1. 匹配问题:28. 实现 strStr()(opens new window)
  2. 重复子串问题:459.重复的子字符串(opens new window)

再一次强调了什么是前缀,什么是后缀,什么又是最长相等前后缀。

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

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

然后针对前缀表到底要不要减一,这其实是不同KMP实现的方式,我们在KMP精讲 (opens new window)中针对之前两个问题,分别给出了两个不同版本的的KMP实现。

其中主要理解j=next[x]这一步最为关键!

双指针回顾

卡老师文章链接:代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾_第3张图片https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html 

总结:本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)。

你可能感兴趣的:(算法)