字符串区间部分翻转

题目描述

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
要求:

该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。

来源:力扣(LeetCode)
链接:字符串区间部分翻转

代码示例:

class Solution {
public:
	//翻转字符串的函数
    void _reverseStr(string& s, int left, int right)
    {
        while (left < right)
        {
            swap(s[left], s[right]);
            ++left;
            --right;
        }
    }

    string reverseStr(string s, int k) {
        int len = s.size();
        if (k > len)//k初始值大于 s.size()的话直接全部翻转
        {
            _reverseStr(s, 0, len - 1);
            return s;
        }
        int left = 0, right = 0;//记录每一次需要翻转的字符串边界
        int i;
        for (i = 0; i + k * 2 < len; i = i + k * 2)//这里i代表左边界的值, 注意跳出条件, 左边界加2k大于等于 len 的时候就该跳出了
        {
            left = i;
            right = i + k - 1;
            _reverseStr(s, left, right);
        }
        if (len - i + 1 < k)//跳出之后对剩余字符的数量进行判断并进行对应翻转, 只需要注意边界条件即可
        {
            _reverseStr(s, i, len - 1);
        }
        else
        {
            _reverseStr(s, i, i + k - 1);
        }
        return s;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章