题目链接:https://leetcode.cn/problems/reverse-string-ii/description/
核心方法:双指针
题目解析:
从字符串的开头开始,每次处理
2k个字符。在这
2k个字符中,反转前k个字符。如果剩下的字符不足
k个,则将这些剩余字符全部反转。如果剩下的字符大于或等于
k但小于2k,则只反转前k个字符,后面的保持不变。
示例1分析:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"解释:
字符串长度为 7
第一轮:处理前
2k=4个字符“abcd":前
k = 2个字符 "ab"反转得到 "ba"后
2个字符 "cd"保持不变 (和题目要求没关系,不要混淆!)
剩下字符处理:
"efg"(长度为 3),满足 3 < 2k (4)并且 3>= k(2):反转前
k=2个字符"ef"->"fe"最后一个 1 字符 “g”保持不变(和题目要求没关系,不要混淆!)
组合起来:"bacd" + "feg" = "bacdfeg"
示例2分析:
输入:s = "abcd", k = 2
输出:"bacd"字符串长度为 4。
第一轮:处理前
2k = 4个字符"abcd":前
k = 2个字符"ab"反转得到"ba"。后
2个字符"cd"保持不变。整体变为
"bacd"。
没有剩余字符,所以最终结果为
"bacd"。
答案:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def reverse_substring(text):
left,right = 0,len(text)-1
while left<right:
text[left],text[right] = text[right],text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0,len(s),2*k):
res[cur:cur+k] = reverse_substring(res[cur:cur +k])
return ''.join(res)
k 和 cur 的变化:
k是固定的,由函数输入决定,表示每次需要反转的字符数。cur是循环变量,表示当前处理的起始位置,每次增加2k:第一次:
cur = 0,处理s[0: k]。第二次:
cur = 2k,处理s[2k: 2k + k]。第三次:
cur = 4k,处理s[4k: 4k + k]。... 直到
cur超过字符串长度。