代码随想录二刷 |字符串|总结篇

代码随想录二刷 |字符串|总结篇

  • 什么是字符串
  • 双指针法
  • 翻转
  • KMP

什么是字符串

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,C++提供一个string类,string类会提供 size 接口,可以用来判断 string 类字符串是否结束:

string a = "asd";
for (int i = 0; i < a.size(); i++) {}

vector< char > 和 string 在基本操作上没有区别,但是 string 提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。

所以想处理字符串,我们还是会定义一个string类型。

双指针法

334.反转字符串中使用双指针法实现了反转字符串的操作,接着在替换空格中,同样使用双指针法在时间复杂度为O(n)的基础上完成了替换空格。

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

27.移除元素使用双指针法进行移除操作。

151.翻转字符串中的单词使用O(n)的时间复杂度完成了删除冗余空格。

翻转

541.反转字符串II中,当需要固定规律一段一段处理字符串时,可以在for循环的表达式上做文章。

只要让i += (2 * k),i 每次移动 2k 个元素即可。

151.翻转字符串里的单词通过先整体翻转后局部翻转的方式实现了反转字符串中的单词。

右旋转字符串中,通过局部翻转再整体翻转的方式实现了右旋转的效果。

KMP

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

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

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

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

使用KMP算法可以解决两类经典问题:

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

你可能感兴趣的:(代码随想录二刷,算法,c++)