题目的主要信息:
- 输入一个只包含小写字母的字符串
- 输出该字符串反转后的字符串
方法一:逆序拼接
具体做法:
我们可以从后往前遍历字符串s,然后准备一个空串依次在其后面添加遍历到的字符,新串就是逆序字符串。
也可以直接逆序遍历字符串s,直接输出,我认为这样唯结果论是没有问题的,但是不符合题意要求的反转字符串。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s;
cin >> s;
string output = ""; //从一个空串开始
for(int i = s.length() - 1; i >= 0; i--) //逆序遍历字符串
output += s[i]; //将字符加到新串后面
cout << output << endl;
return 0;
}
复杂度分析:
- 时间复杂度:O(n),n为字符串的长度,一次遍历
- 空间复杂度:O(n),output记录新串,长度等于原串
方法二:双指针交换
具体做法:
准备两个指针,从字符串一首一尾同时出发,每次交换二者指向的字符,直到二者相遇,这样刚好可以将字符串首尾交换,完成反转。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s;
cin >> s;
//左右双指针
int left = 0;
int right = s.length() - 1;
while(left < right){ //两指针往中间靠
swap(s[left], s[right]); //交换两边字符
left++;
right--;
}
cout << s << endl;
return 0;
}
复杂度分析:
- 时间复杂度:O(n),n为字符串长度,一共循环n/2次
- 空间复杂度:O(1),无额外空间
方法三:反转函数
具体做法:
调用algorithm库里面的reverse函数可以直接对字符串反转,然后输出。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s;
cin >> s;
reverse(s.begin(), s.end()); //逆转函数
cout << s;
return 0;
}
复杂度分析:
- 时间复杂度:O(n),reverse函数的复杂度为O(n)
- 空间复杂度:O(1),无额外空间