什么是字符串
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,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.重复的子字符串