字符串解题总结


字符串经典题目

双指针法

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

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

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

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

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

反转系列

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

反转字符串II中,一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。其实当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。只要让 i += (2 * k) ,i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多。

翻转字符串里的单词中要求翻转字符串里的单词,这道题目可以说是综合考察了字符串的多种操作。是考察字符串的好题。这道题目通过 先整体反转再局部反转,实现了反转字符串里的单词。

后来发现反转字符串还有一个牛逼的用处,就是达到左旋的效果。在右旋字符串中,我们通过先局部反转再整体反转达到了左旋的效果。

KMP算法

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

KMP的精髓所在就是前缀表,在实现strStr()中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。

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

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

匹配问题:实现 strStr()
重复子串问题:重复的子字符串
再一次强调了什么是前缀,什么是后缀,什么又是最长相等前后缀。

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

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


文章作者: leven
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 leven !
评论
  目录