给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii
python
# 反转字符串1
def reverse(s_list, l, r):
"""
反转列表,左右指针交换元素,相遇停止
:param s_list:
:param l:
:param r:
:return:
"""
while l < r:
temp = s_list[l]
s_list[l] = s_list[r]
s_list[r] = temp
l += 1
r -= 1
class Solution:
def reverseStrII(self, s: str, k: int):
"""
双指针法, 时间O(n), 空间O(n) -> s>list, O(n)空间
:param s:
:param k:
:return:
"""
s_list = list(s) # 字符串在py中属于不可变类型,转成list操作
n = len(s_list)
for l in range(0, n-1, 2*k): # 间隔2k
r = l + k -1 # 右指针,需要反转的右指针位置
r = r if r < n-1 else n-1 # 右指针取小值,即当r<n-1时,反转前k个字符,反之全部反转
reverse(s_list, l, r)
# reverse(s_list, l, min(r, n-1)) 上述简化
return ''.join(s_list) # 转回字符串输出
if __name__ == "__main__":
s = 'legendABC'
k = 3
test = Solution()
print(test.reverseStrII(s, k))
golang
package main
import "fmt"
func main() {
s := "lengendABC"
k := 3
fmt.Println(reverseStrII(s, k))
}
func reverseStrII(s string, k int) string {
t := []byte(s)
n := len(t)
for l := 0; l < n-1; l += 2 * k {
r := l + k - 1
reverse(t, l, min(r, n-1))
}
return string(t)
}
func reverse(ss []byte, l, r int) {
for l < r {
ss[l] ^= ss[r]
ss[r] ^= ss[l]
ss[l] ^= ss[r]
l++
r--
}
}
func min(a, b int) int {
if a < b {
return a
}
return b
}