leetcode541. 反转字符串Ⅱ(区间部分反转)

Posted 2021dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode541. 反转字符串Ⅱ(区间部分反转)相关的知识,希望对你有一定的参考价值。

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

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

示例:
 输入:s = “abcdefg”, k = 2
 输出:“bacdfeg”

思路:
既然是每 2k 个字符,反转其前 k 个,那么我们可以以 2k 为一个单位对字符串进行遍历,并反转其前 k 个即可。

这里以k = 2为例,我们用left和right来标记当前遍历的 2k 个字符中需要被反转的 k 个字符,left标记第一个需要被反转的字符,right标记最后一个需要被反转的字符的下一个字符。

反转被left和right所标记的 k 个字符,left向后移动 2k 个字符,right在left的基础上再向后移动 k 个字符,标记下一个 2k 区间当中需要被反转的前 k 个字符。

如此进行下去,直到字符串遍历完毕。

边界控制:
根据题目要求:若剩下的字符小于 k 个,则全部反转;若剩下的字符大于 k 个但小于 2k 个,则还是只反转前 k 个。
介于此,我们每次更新right的位置后都需要检查right是否越界,若越界,则让right标记字符串末尾。

代码如下:

class Solution {
public:
	string reverseStr(string s, int k) {
		int sz = s.size();
		//以2k为一个单位对字符串进行遍历
		for (int left = 0; left < sz; left += 2 * k)
		{
			int right = left + k; //标记最后一个需要被反转的字符的下一个字符
			if (right > sz)
				right = sz; //若越界,则让right标记字符串末尾
			reverse(s.begin() + left, s.begin() + right); //反转left和right所标记的k个字符
		}
		return s; //返回目标字符串
	}
};

以上是关于leetcode541. 反转字符串Ⅱ(区间部分反转)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode541

LeetCode 541. 反转字符串 II / 701. 二叉搜索树中的插入操作 / 807. 保持城市天际线

Java算法 每日一题 编号541:反转字符串 II

Java算法 每日一题 编号541:反转字符串 II

Java算法 每日一题 编号541:反转字符串 II

LeetCode 541 翻转字符串II[翻转] HERODING的LeetCode之路