代码随想录 | 字符串总结

双指针法

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

代码随想录算法day07 | 字符串part1 | 344.反转字符串,541. 反转字符串II,卡码网:54.替换数字-CSDN博客

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

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

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

代码随想录算法day01| 数组part1|704. 二分查找、27. 移除元素-CSDN博客

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

代码随想录算法day08 | 字符串part2 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串-CSDN博客

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

反转系列

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

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

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

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

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

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

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

代码随想录算法day08 | 字符串part2 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串-CSDN博客

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

卡码网:55.右旋字符串中,我们通过先局部反转再整体反转达到了右旋的效果。

代码随想录算法day08 | 字符串part2 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串-CSDN博客

KMP

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

KMP的精髓所在就是前缀表,在KMP思想中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。

代码随想录算法day08 | KMP思想 | 28.实现strStr(),459.重复的子字符串-CSDN博客

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

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

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

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

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

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

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

总结

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

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

KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易!多写多思考!

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值