携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 <= 10^5
- s[i] 都是 ASCII 码表中的可打印字符
二、思路分析:
这道题目有两种做法,一种是递归,一种不是递归。
我的循环代码如下
class Solution {
public:
void reverseString(vector<char>& s) {
if ( s.size() == 0 ) return ;
for (int i = 0; i < s.size() / 2; i++){
char tmp = s[i];
s[i] = s[s.size() - i - 1];
s[s.size()- i - 1] = tmp;
}
return;
}
};
几乎所有的循环都可以改成递归形式。主要问题是如何改?
终止条件:从for循环中我们可以知道递归的终止条件是i >= s.size() / 2, 当字符串长度为3,当i=1的时候,就可以停止了。
处理逻辑:每一次循环的关键语句是交换,第i个字符和s.size() - i - 1位置的字符。
因此代码可以改写成
class Solution {
public:
void reverseString(vector<char>& s) {
helper(s, 0, s.size());
}
void helper(vector<char>& s, int pos, int s_len){
if ( pos >= s_len / 2) return;
char tmp = s[pos];
s[pos] = s[s_len - 1 - pos];
s[s_len - 1 - pos ] = tmp;
helper(s, pos+1, s_len);
}
};
三、总结:
如果用双指针的话,每次就需要更新left和right两个参数,最终的结束条件是left>=right