Leetcode递归问题C++版--反转字符串

Leetcode递归问题C++版本

  • 反转字符串

反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:

输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

解题思路:
在这道问题中有几个被限制住的点:
1.需要在原地修改数组
2.空间复杂度为O(1)

相关概念在此不再赘述,对于限制条件加以注意,故要注意所创建的变量个数。

方法一:暴力交换法
在不创建任何变量的前提下, 依次交换首元素和尾元素,实现向量组的转制。

void reverseString(vector<char>& s){
    for(int i = 0 ; i < s.size()/2 ; ++i){
        swap(s[i],s[s.size()-i-1]);
    }
}

其中数组整体长度为n,故只需要交换n/2个元素即可。

方法二:递归交换法
在不创建任何变量的情况下,通过递归的方法,交换对应元素,实现向量组的转制。

void recurse(vector<char>& s,int start ,int end){
    if(start >= end)
        return;
    swap(s[start],s[end]);
    recurse(s, ++start, --end);
}
void reverseString(vector<char>& s){
    int len = s.size();
    if(len == 0 || len == 1)
        return;
    recurse(s,0,len-1);
}

通过递归调用的方法依次调用。

外框架代码

#include <iostream>
#include <vector>
int main() {
    vector<char> s;
    char c[] = "hello";
    for(int i = 0 ; i < 6; ++i){
        s.push_back(c[i]);
    }
    //将数据放入向量组
    reverseString(s);
    for(int i = 0 ; i < 6; ++i){
        cout<<s[i];
    }
    //输出向量组
    cout<<endl;
    return 0;
}

题目链接https://leetcode-cn.com/explore/featured/card/recursion-i/256/principle-of-recursion/1198/

你可能感兴趣的:(leetcode刷题记录)