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、小结
空间和时间我们总是只能偏爱一个,两者同时兼顾,只能说相对来说,绝对兼顾是不存在的,至少现在还没人能解决这个问题。
反转字符串大概就这样,递归的话,总结出来就是函数自身调用自身,去解决一系列子问题,直到所有子问题都解决之后,递归就结束。
版权声明:转载请注明出处,谢谢!