题目的主要信息:

  • 输入一个只包含小写字母的字符串
  • 输出该字符串反转后的字符串

方法一:逆序拼接

具体做法:

我们可以从后往前遍历字符串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)O(n)O(n)nnn为字符串的长度,一次遍历
  • 空间复杂度:O(n)O(n)O(n),output记录新串,长度等于原串

方法二:双指针交换

具体做法:

准备两个指针,从字符串一首一尾同时出发,每次交换二者指向的字符,直到二者相遇,这样刚好可以将字符串首尾交换,完成反转。

alt

#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)O(n)O(n)nnn为字符串长度,一共循环n/2n/2n/2
  • 空间复杂度:O(1)O(1)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)O(n)O(n),reverse函数的复杂度为O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1),无额外空间