【力扣-字符串】1、反转字符串I(344)II(541)

568 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

344. 反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]

示例 2:

输入: s = ["H","a","n","n","a","h"]
输出: ["h","a","n","n","a","H"]

双指针法

题述中原地修改数组,所以就可以考虑使用双指针来解题

class Solution
{
public:
    void reverseString(vector<char> &s)
    {
        int left = 0, right = s.size() - 1;
        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }
};

541. 反转字符串 II

题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

 

示例 1:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

示例 2:

输入: s = "abcd", k = 2
输出: "bacd"

思路

  1. 设置索引,每次移动2k步
  2. 判断剩余的字符是否大于k,大于k的话是否大于2k,将满足条件的反转
  3. 将剩余的小于k个的字符进行反转

代码

自己实现reverse函数

class Solution1
{
public:
    // 自己实现reverse算法
    void myReverse(string &s, int start, int end)
    {
        for (int i = start, j = end; i < j; i++, j--)
        {
            swap(s[i], s[j]);
        }
    }
    string reverseStr(string s, int k)
    {

        for (int i = 0; i < s.size(); i += (2 * k))
        {
            //1、每2k个字符中反转前k个字符
            //2、剩余的字符大于k但是小于2k,反转前k个
            if (i + k <= s.size())
            {
                myReverse(s, i, i + k - 1);
                continue;
            }
            //3、剩余的小于k个的字符全部反转
            myReverse(s, i, s.size() - 1);
        }
        return s;
    }
};

调用库函数 reverse

class Solution
{
public:
    string reverseStr(string s, int k)
    {
        for (int i = 0; i < s.size(); i += (2 * k))
        {
            //1、每2k个字符中反转前k个字符
            //2、剩余的字符大于k但是小于2k,反转前k个
            if (i + k <= s.size())
            {
                // 反转前k个字符
                reverse(s.begin() + i, s.begin() + i + k);
                continue;
            }

            //3、剩余的字符数量小于k,则全部反转
            reverse(s.begin() + i, s.begin() + s.size());
        }
        return s;
    }
};