C风格字符串和C++ string的字符串
C风格字符串是一个以 '\0'
为结尾的字符数组,string 是一个对字符串数组的封装,是一个类。
那么vector< char > 和 string 又有什么区别呢?
其实本质上没有区别,只不过 string 提供了更有利于字符串操作的接口。
要不要使用库函数
总结来说,如果题目的要求是实现这个库函数的功能,那就不要使用。如果是题目要求的非关键部分,则可以使用试一试。
如果你了解 substr,split,reverse 之类的库函数实现原理,你就知道何时该使用库函数了。
双指针法
反转字符串 当中我们使用了双指针法,两个指针指向的元素交换数值,然后指针向内收缩。双指针在线性结构的数据结构如数组、链表、哈希表中很常见。
替换数字 当中我们很常用双指针法对字符串进行了填充,类似的,很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作
对于数组中移除元素的操作,我们在 移除元素 中也使用了双指针法删除了符合条件的数组,但是 翻转字符串中的单词 不仅需要删除空格元素,还需要再单词之间保留一个空格,因此呢,就采用了快指针找到一个单词(slow判断非首单词)后用双指针先填充一个空格再填充该单词,若是首单词就先填充空格再填充单词。最后使用 resize 去除多余元素。我们实现了使用O(n)的时间复杂度删除了冗余空格,这正是 split 实现的功能
反转系列
反转字符串 II 要求我们以 2k 的间隔依次反转前 k 个字符,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
反转字符串里的单词 是一道好题,考察了字符串的多种操作。使用双指针法原地移除冗余空格,自定义 reverse 函数反转字符串,再通过两次反转,第一次反转整个字符串,第二次反转每个单词。
进一步,对于这种整体反转再局部反转的做法,如果没有任何空格,我们可以达到左旋或者右旋的效果右旋字符串
总结
对于字符串题目而言,十分考验代码的掌控能力,循环条件、边界条件真的十分重要,很容易绕晕。