21-反转字符串

21-反转字符串,第1张

反转字符串
  • 1. 题目链接
  • 2. 思路
  • 3.代码实现
    • 3.1 c++实现
    • 3.2 c实现
  • 4.复杂度分析

1. 题目链接

LeetCode题目链接

2. 思路

双指针法

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。


一共执行了 N/2次的交换。


对于长度为 N 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s[0] s[1] s[2] … s[N - 1],那么反转后字符数组为 s[N - 1] s[N - 2] … s[0]。


比较反转前后下标变化很容易得出 s[i] 的字符与 s[N - 1 - i] 的字符发生了交换的规律,因此我们可以得出如下双指针的解法:

  • 将 left 指向字符数组首元素,right 指向字符数组尾元素。


  • 当 left < right:
    1)交换 s[left] 和 s[right];
    2) left 指针右移一位,即 left = left + 1;
    3) right 指针左移一位,即 right = right - 1。


  • 当 left >= right,反转结束,返回字符数组即可。


3.代码实现 3.1 c++实现

class Solution {
public:
    void reverseString(vector<char>& s) {
        for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
            swap(s[i],s[j]);
        }
    }
};


//或者

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n = s.size();
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            swap(s[left], s[right]);
        }
    }
};
3.2 c实现
void swap(char *a, char *b) {
    char t = *a;
    *a = *b, *b = t;
}

void reverseString(char *s, int sSize) {
    for (int left = 0, right = sSize - 1; left < right; ++left, --right) {
        swap(s + left, s + right);
    }
}
4.复杂度分析
  • 时间复杂度:O(N),其中 N 为字符数组的长度。


    一共执行了 N/2次的交换。


  • 空间复杂度:O(1)。


    只使用了常数空间来存放若干变量。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/634617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-16
下一篇 2022-04-16

发表评论

登录后才能评论

评论列表(0条)

保存