方向一 题目解析 字符串解压缩| 豆包MarsCode AI刷题

32 阅读2分钟

image.png 这道题的目的是实现一个字符串解压缩函数 solution(s: str) -> str,其中输入字符串 s 采用了一种特定的压缩格式。每个字母后面可能会跟随一个数字,表示该字母在解压后的字符串中需要重复出现的次数;如果字母后面没有数字,则默认该字母只出现一次。

题目分析

  1. 输入格式:字符串中每个字母后面可以跟一个数字,表示该字母要重复的次数。
  2. 输出格式:解压后的字符串,将字母按指定的次数重复排列。
  3. 特例处理:若数字为 0,表示删除前一个字符。

解题思路

  1. 遍历字符串:逐个字符扫描字符串 s
  2. 识别字母:如果当前字符是字母(不是数字),直接将其添加到结果列表 res 中。
  3. 识别数字:如果当前字符是数字,继续读取后续的数字字符,拼接为一个完整的数字。
    • 将此数字转换为整数 temp,如果 temp == 0,删除结果中的最后一个字符;否则,将前一个字母重复 temp - 1 次添加到结果列表。
  4. 拼接输出:遍历结束后,将 res 列表转化为字符串并返回。

代码实现

def solution(s: str) -> str:
    res = []
    i = 0
    while i < len(s):
        # 识别字母并添加到结果
        if ord(s[i]) < ord('0') or ord(s[i]) > ord('9'):
            res.append(s[i])
            i += 1
        else:
            # 识别数字并处理
            temp = ""
            while i < len(s) and ord('0') <= ord(s[i]) <= ord('9'):
                temp += s[i]
                i += 1
            temp = int(temp)
            if temp == 0:
                res.pop()
            else:
                res.extend([res[-1]] * (temp - 1))  # 重复前一个字符 temp - 1 次
    return "".join(res)

# 测试用例
if __name__ == '__main__':
    print(solution("a2b3c4") == 'aabbbcccc')
    print(solution("d5ef2") == 'dddddeff')
    print(solution("x3y1z") == 'xxxyz')

复杂度分析

  • 时间复杂度O(n),其中 n 为字符串 s 的长度。每个字符仅遍历一次,数字部分可能多次延展前一个字符。
  • 空间复杂度O(n),存储解压后的结果字符串。

测试

提供的代码测试了以下几个情况:

  • 输入 s = "a2b3c4",输出为 aabbbcccc
  • 输入 s = "d5ef2",输出为 dddddeff
  • 输入 s = "x3y1z",输出为 xxxyz

通过这些测试用例,可以验证该解法的正确性和有效性。