【刷题笔记】344. 反转字符串

71 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

参考

ACM 选手图解 LeetCode 反转字符串 | 编程文青李狗蛋 - 反转字符串 - 力扣(LeetCode)

「代码随想录」带你搞定字符串!344. 反转字符串:【双指针法】详解 - 反转字符串 - 力扣(LeetCode)