C++ LeetCode 力扣刷题 344. 反转字符串
题目
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105s[i]都是 ASCII 码表中的可打印字符
代码说明
在这个代码中,s是函数rerverseString的参数,其类型是vector<char>&,表示:
vector<char>:这是C++标准库中的动态字符数组(字符向量),可以理解为一个存储字符的容器,类似字符串(但字符串以空字符'\0'结尾,而vector<char>不需要)。
&:一个引用传递。以为着函数内部对s的修改会直接作用于外部传入的原容器,而不是创建一个副本,这样可以提高效率。
简单来说,s 就是需要被反转的字符序列(比如可能是 "hello" 对应的字符向量 {'h','e','l','l','o'}),函数的作用就是将这个序列反转(比如变成 {'o','l','l','e','h'})。
代码思路
1. 明确问题需求
需要实现一个函数,接收一个字符向量(vector<char>& s),并将其原地反转(即直接修改原向量,不额外创建新容器)。例如:
- 输入:
['h','e','l','l','o'] - 输出:
['o','l','l','e','h']
2. 思考核心逻辑:如何反转序列?
反转的本质是将序列的第一个元素与最后一个元素交换,第二个与倒数第二个交换,以此类推,直到中间位置。
例如,对于长度为 n 的序列,需要交换的位置对是:
- 第
0个 和 第n-1个 - 第
1个 和 第n-2个 - ...
- 直到两个位置相遇或交叉(即左边位置 >= 右边位置)
3. 选择实现方式:双指针法
这是最直观且高效的方法:
- 定义两个指针(索引):
left从序列头部开始(初始值0),right从序列尾部开始(初始值s.size() - 1)。 - 交换
left和right指向的字符。 - 移动指针:
left向右移(left++),right向左移(right--)。 - 重复上述步骤,直到
left >= right(此时所有对称位置已交换完毕)。
4. 考虑边界情况
- 若序列为空(
s.empty())或只有一个元素(s.size() == 1),无需反转,直接返回。 - 序列长度为偶数或奇数时,双指针的终止条件(
left < right)均适用(奇数时中间元素无需交换)。
5. 确定代码结构
- 初始化双指针
left和right。 - 使用
while循环执行交换和指针移动,循环条件为left < right。 - 交换操作可直接使用 C++ 标准库的
swap函数,简洁高效。
基于以上思路,最终可写出双指针实现的代码,满足原地反转、时间复杂度 O(n)(遍历半次序列)、空间复杂度 O(1)(仅用常数额外空间)的要求。
代码内容
class Solution {
public:void reverseString(vector<char>& s) {int left = 0;int right = s.size() - 1;while(left < right){swap(s[left], s[right]);left++;right--;}}
};
