大家好呀,我是加倍反转蛋。
今天解决的反转字符串Ⅱ,是在上篇简单到扣脚的反转字符串的基础上,加了一丢丢的限制条件。
不过不慌,依然还是个简答题,直接肝。
LeetCode 541:反转字符串Ⅱ
题意
我给定一个字符串 s 和一个整数 k,从开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 个,则反转前 k 个字符,其余字符保持原样。
示例
输入:s = “abcdefg”,k = 2
输出:“bacdfeg”
提示
- 1 <= s.length <= 10^4
- s 仅由小写英文组成
- 1 <= k <= 10^4
题目解析
水题,难度简单。
题意还是很好理解的,一句话说就是:每次隔着 k 个字符反转 k 个字符。
字符串的反转,在上道题字符串反转中写过,链接在下面:
重点就是将 s[0] s[1] … s[n-1] 以 s[n-1] … s[1] s[0] 的形式输出。
即 s[i] 和 s[n - i - 1] 交换位置。
可以使用双指针的方式解决字符串反转,维护一个左指针 left 和右指针 right。
初始化 left 指向数组首元素,right 指向数组右元素。
当 left < right 的时候,交换 s[left] 和 s[right],同时 left 右移,right 左移。
这道题就是直接按照题意模拟就好了,就是注意一下边界问题,也就是最后剩余的字符块:
- 剩余字符块的长度 0 <= length <= k 时,不满足 k 个字符,当前字符直接全部反转。
- 当前字符块的长度 k <= length <= 2k,那前 k 个字符是完整的,只反转前 k 个字符。
图解
以 s = “abcdefg”,k = 2 为例。
按照要求,每次计数至 2k 个字符,则在此,2 * k = 4。
字符串 s 相当于被分为了两部分 “abcd” 和 “efg”。