1.题目描述
给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
输入:s = “abcd”, k = 2
输出:“bacd”
提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
2.思路分析
2.1 模拟
反转每个下标从 2k的倍数开始的,长度为 k的子串。若该子串长度不足 k,则反转整个子串。
3.代码实现
class Solution:
def reverseStr(self, s: str, k: int) -> str:
"""
1. 使用range(start, end, step)来确定需要调换的初始位置
2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,
这个特性可以避免一些边界条件的处理。
3. 用切片整体替换,而不是一个个替换.
"""
res = list(s)
# 遍历字符串,每次走2k步
for i in range(0,len(s),2*k):
res[i:i+k] = self.reverseString(res[i:i+k])
return ''.join(res)
# 定义一个反转字符串的方法
def reverseString(self, s:str)->str:
left,right = 0,len(s)-1
while left < right:
s[left],s[right] = s[right],s[left]
left += 1
right -=1
return s
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。
- 空间复杂度:O(n)。