日野弥生:勉強しよう

LeetCode 443 - 压缩字符串

发表于2025年04月13日

#双指针 #字符串

本题要求原地修改字符串列表,很明显需要用到双指针。

class Solution:
    def compress(self, chars: List[str]) -> int:
        # 提前剪枝
        length = len(chars)
        if length == 0:
            return 0
        fast, slow, curr = 0, 0, 0

        # lastExe的设计是为了快指针超出列表索引后仍然能执行一次循环
        lastExe = True
        while fast < length or lastExe:
            if fast >= length:
                lastExe = False
            if lastExe and chars[fast] == chars[slow]:
                fast += 1
            else:
                if fast - slow > 1:
                    chars[curr] = chars[slow]
                    curr += 1
                    # 把长度转为数字字符
                    numList = list(str(fast - slow))
                    for i in numList:
                        chars[curr] = i
                        curr += 1
                    slow = fast
                    fast += 1
                else:
                    chars[curr] = chars[slow]
                    slow = fast
                    curr += 1
                    fast += 1
        # 删除尾部字符
        del chars[curr:]
        return len(chars)

经由chat-pgt简化后的逻辑如下:

class Solution:
    def compress(self, chars: List[str]) -> int:
        n = len(chars)
        if n == 0:
            return 0
        
        curr = 0  # 当前索引
        slow = 0  # 当前字符开始的索引
        fast = 0  # 快速遍历索引
        
        while fast < n:
            # 移动 fast 到当前字符的结束位置,这里的操作避免了定义lastExe,也能让最后一次执行顺利在外层while循环里完成
            while fast < n and chars[fast] == chars[slow]:
                fast += 1
            
            # 填充字符
            chars[curr] = chars[slow]
            curr += 1
            
            # 如果有重复的字符,添加数字
            if fast - slow > 1:
                for c in str(fast - slow):  # 转换为字符串逐个添加
                    chars[curr] = c
                    curr += 1
            
            # 更新 slow 为 fast(指向下一个不同字符的位置)
            slow = fast
        
        # 无需删除,只需要返回长度即可
        return curr

フラッシュタブ:LeetCode

题目链接:https://leetcode.cn/problems/string-compression/

上一篇

LeetCode 345 - 反转字符串中的元音字母

下一篇

LeetCode 392 - 判断子序列