Skip to content

代码随想录 字符串 541 反转字符串 II

题目链接:https://leetcode.cn/problems/reverse-string-ii/description/

文章讲解:https://programmercarl.com/0541.反转字符串II.html

题目描述

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

如果剩余字符少于 k 个,则将剩余字符全部反转。

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

示例:

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

思路

该题目依然是反转字符串,但是不同的是,按照一定规律进行翻转,每 2k 个翻转前 k 个。

依然要用到双指针,头指针指向前 k 个中的第一个,尾指针指向前 k 个中的最后一个。当然也可以只用库函数,因为 reverse 只是该解决步骤中的一小步。循环 2k 个即可。需要注意的是 reverse 函数接受的是迭代器,注意用法即可。

cpp
#include <string>
#include <algorithm>
using namespace std;

string reverseStr(string s, int k)
{
    for (int i = 0; i < s.size(); i += (2 * k)) // 步长位2k
    {
        if (i + k <= s.size()) // 剩余字符小于 2k 但大于或等于 k 个
        {
            reverse(s.begin() + i, s.begin() + i + k);
        }
        else // 剩余字符少于 k 个
        {
            reverse(s.begin() + i, s.end());
        }
    }
    return s;
}
int main(){}