题目的主要信息:
- 输入一个只包含小写字母的字符串
- 输出该字符串反转后的字符串
举一反三:
学习完本题的思路你可以解决如下题目:
方法一:双指针交换(推荐使用)
知识点:双指针
双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。
思路:
字符串反转即逆序,前后顺序是反的,也就是前面的字符换到了后面,后面的字符换到了前面,那既然这样我们就将前后的顺序依次对称交换,这时候就需要使用到了对撞双指针,从前后同时遍历。
具体做法:
- step 1:准备两个指针,从字符串一首一尾同时出发。
- step 2:每次交换二者指向的字符,直到二者相遇,这样刚好可以将字符串首尾交换,完成反转。
图示:
Java代码实现:
import java.util.*;
public class Solution {
public String solve (String str) {
//左右双指针
char[] s = str.toCharArray();
int left = 0;
int right = str.length() - 1;
//两指针往中间靠
while(left < right){
char c = s[left];
//交换位置
s[left] = s[right];
s[right] = c;
left++;
right--;
}
return new String(s);
}
}
C++代码实现:
class Solution {
public:
string solve(string str) {
//左右双指针
int left = 0;
int right = str.length() - 1;
//两指针往中间靠
while(left < right){
//交换两边字符
swap(str[left], str[right]);
left++;
right--;
}
return str;
}
};
Python实现代码:
class Solution:
def solve(self , str: str) -> str:
#左右双指针
left = 0
right = len(str) - 1
#两指针往中间靠
while left < right:
l_s = list(str)
temp = l_s[left]
l_s[left] = l_s[right]
#交换两边字符
l_s[right] = temp
str = ''.join(l_s)
left += 1
right -= 1
return str
复杂度分析:
- 时间复杂度:,为字符串长度,一共循环次
- 空间复杂度:,常数级变量,没有使用额外辅助空间
方法二:逆序拼接(扩展思路)
思路:
方法一是在原串上面操作,如果原串不能动的情况下,我们可以新开辟一个串,逆序遍历原串,将结果拼接就好。
具体做法:
- step 1:我们可以从后往前遍历原始字符串。
- step 2:准备一个空串依次在其前面添加遍历到的字符,新串就是逆序字符串。
Java代码实现:
import java.util.*;
public class Solution {
public String solve (String str) {
//从一个空串开始
String output = "";
//逆序遍历字符串
for(int i = str.length() - 1; i >= 0; i--)
//将字符加到新串后面
output += str.charAt(i);
return output;
}
}
C++代码实现:
class Solution {
public:
string solve(string str) {
//从一个空串开始
string output = "";
//逆序遍历字符串
for(int i = str.length() - 1; i >= 0; i--)
//将字符加到新串后面
output += str[i];
return output;
}
};
Python实现代码:
class Solution:
def solve(self , str: str) -> str:
#从一个空串开始
output = ""
i = len(str) - 1
#逆序遍历字符串
while i >= 0 :
#将字符加到新串后面
output += str[i]
i -= 1
return output
复杂度分析:
- 时间复杂度:,为字符串的长度,一次遍历
- 空间复杂度:,output记录新串,长度等于原串