算法思想一:反向遍历
解题思路:
题目要求对给出的字符串进行反转,首先想到的是通过对字符进行反向遍历,遍历的顺序就是字符串的反转结果
1、定义返回字符
2、循环反向遍历字符串 str,将遍历的字符添加到返回字符串中
3、返回 res
代码展示:
Python版本
class Solution: def solve(self , str ): # write code here # 初始化返回字符串 res = '' # 从后向前遍历字符串 str, for i in range(len(str)-1, -1, -1): # 将遍历的字符串添加到res中 res += str[i] return res
复杂度分析
时间复杂度:N表示字符串的长度,遍历字符串时间
空间复杂的:N表示字符串的长度,返回字符串占用的空间
算法思想二:双指针
解题思路:
首先将字符串转换为字符数组,对于长度为 N 的待被反转的字符数组,可以观察反转前后下标的变化,假设反转前字符数组为 ,那么反转后字符数组为 。比较反转前后下标变化很容易得出 的字符与 的字符发生了交换的规律,因此可以得出如下双指针的解法:
1、将 指向字符数组首元素,right 指向字符数组尾元素。
2、当 :
1、交换 和 ;
2、 指针右移一位,即 ;
3、 指针左移一位,即 。
3、当 ,反转结束,将字符数组转换为字符串返回即可
图解:
代码展示:
JAVA版本
import java.util.*; public class Solution { /** * 反转字符串 * @param str string字符串 * @return string字符串 */ public String solve (String str) { // write code here // 字符串转为字符数组 char[] cstr = str.toCharArray(); // 字符串的长度 int n = str.length(); // 双指针,从两头往中间遍历 for (int left = 0, right = n - 1; left < right; ++left, --right) { // 交换双指针对应的字符 char tmp = cstr[left]; cstr[left] = cstr[right]; cstr[right] = tmp; } // 重新转为 字符串 return new String(cstr); } }
复杂度分析
时间复杂度:表示字符串的长度,一共执行了 次交换
空间复杂的:使用字符数组占用空间
算法思想三:库函数
解题思路:
一般情况下此种方法不推荐使用,只作了解即可
代码展示:
Python版本
class Solution: def solve(self , str ): # write code here # 函数库 return str[::-1]
JAVA版本
import java.util.*; public class Solution { public String solve (String str) { StringBuffer sb =new StringBuffer(str);//此方法针对的是io流,不能针对字符串。 return sb.reverse().toString(); } }
C++版本
class Solution { public: string solve(string str) { reverse(str.begin(),str.end()); return str; } };
复杂度分析
时间复杂度:N表示字符串的长度,变换操作都是遍历操作
空间复杂的:不需要额外空间或仅需要常数级空间