字符串基础理论
- 字符串的前世今生:
- 在C语言中,字符串实际上是一个字符数组,把一个个字符存储在一个数组中,在末尾加上’\0’表示字符串的末尾。
- 到了C++中,提供了string类,不以’\0’表示字符串的结束。同时,使用string类生成的字符串是可变长度,还提供了很多处理字符串的相关接口,例如:size()返回字符串的长度。
- 通用操作
不管是字符数组还是string类生成的字符串,都使用
s[index]
来访问元素的。
题型分类
关于字符串的题型主要分两类:
- 对字符串的操作:字符串翻转、字符串替换、字符串的局部移动
- 对字符串的匹配:在字符串中寻找目标子串、判断字符串是否由重复子串组成。
操作字符串
- 翻转字符串:翻转过程就是元素进行位置交换。
使用双指针法解决问题。
但要注意的是,双指针法在有些题中被用于降低时间复杂度,在有些题中别用于解决问题。
双指针有多种形态:快慢指针、双头指针(分别指向序列两头的指针)。
匹配字符串
- 在字符串中寻找目标子串:这里主要学习KMP算法。
KMP算法的核心:
- 前缀表:next数组的含义、求法、用法。
- 匹配时使用前缀表进行回退操作。
- 判断字符串是否由重复子串组成:KMP算法的灵活应用。
- 这里主要使用了前缀表中存储的最长公共前后缀长度进行条件判断。
- 不过解题的重点是方法的推导。
总结
- 对于字符串的操作考验了对代码的掌控能力,需要用双指针法、扩容等操作来解决问题。
- 其中,对字符串的匹配一方面考察了对代码的掌控能力(暴力解法、KMP算法),另一方面考察了推导解决问题方法的能力(KMP算法)。