【LeetCode】递归类算法:反转字符串

01、文章目录

02、问题描述

反转字符串:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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”]

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/recursion/490ye/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

03、思路

这个问题,其实不一定要递归解决,但是,今天只讨论递归,主要是为了以后学习数据结构——树做一些理论铺垫。

看到这个问题,其实很明了,不就是交换首尾内容,然后一个向前,一个向后,直到相等或者大于就停止嘛。我也是这么做的。但是由于有限制条件O(1)的额外空间与原地修改数组,那我觉得还是递归简单一点,因为你不用递归,一个for就是O(n),我不否定有符合条件的办法,但是何必为难自己呢,只要不是无解,递归这种空间换时间也不是一定不可取。

话不多说,看如下代码,通以往文章,C和C++实现。

04、代码实现

4.1 C语言版

C语言版,我这里就用异或 和 下面这种方法实现。

  • 同思路版
void reverseString(char* s, int sSize)
{
	if(sSize == 0 || sSize == 1)
	{
		return;
	}

	Myreverse(0,sSize-1,s);	
}

void Myreverse(int start, int end, char* s)
{
	if(start >= end)  //或者 >= nSize/2也可以,但是传参要自己处理好
	{
		return;
	}

	char tmp = s[start];
	s[start] = s[end];
	s[end] = tmp;

	start++;
	end--;

	Myreverse(start,end,s);
}
  • 不同思路版
void reverseString(char* s, int sSize)
{
     int i=0, j = sSize-1;

    while(i<sSize/2)
    {
        s[i] ^= s[j];
        s[j] ^= s[i];
        s[i++] ^= s[j--];
    }
}

在这里插入图片描述

如果各位对于异或看不太懂,可以看下我的一篇博客:https://blog.csdn.net/m0_43458204/article/details/107718350

4.2 C++版
class Solution {
public:
    void reverseString(vector<char>& s) 
    {
       reverseString(0,s.size() - 1,s); 
    }

    void reverseString(int start, int end, vector<char>&s)
    {
        if(start >= end)
        {
            return; //表示交换到中间位置了
        }
        
        char tmp = s[start];
        s[start] = s[end];
        s[end] = tmp;

        start++;
        end--;

        reverseString(start,end,s); 
    }
};

在这里插入图片描述

05、小结

空间和时间我们总是只能偏爱一个,两者同时兼顾,只能说相对来说,绝对兼顾是不存在的,至少现在还没人能解决这个问题。

反转字符串大概就这样,递归的话,总结出来就是函数自身调用自身,去解决一系列子问题,直到所有子问题都解决之后,递归就结束。

版权声明:转载请注明出处,谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值