题目链接:https://leetcode.cn/problems/reverse-string-ii/description/

核心方法:双指针

题目解析:

  1. 从字符串的开头开始,每次处理 2k 个字符。

  2. 在这 2k 个字符中,反转前 k 个字符。

  3. 如果剩下的字符不足 k 个,则将这些剩余字符全部反转。

  4. 如果剩下的字符大于或等于 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)
        

kcur 的变化:

  • k 是固定的,由函数输入决定,表示每次需要反转的字符数。

  • cur 是循环变量,表示当前处理的起始位置,每次增加 2k

    • 第一次:cur = 0,处理 s[0: k]

    • 第二次:cur = 2k,处理 s[2k: 2k + k]

    • 第三次:cur = 4k,处理 s[4k: 4k + k]

    • ... 直到 cur 超过字符串长度。