字符串解压缩 | 豆包MarsCode AI刷题

141 阅读2分钟

问题描述

小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。


测试样例

样例1:

输入:s = "a2b3c4"
输出:'aabbbcccc'

样例2:

输入:s = "d5ef2"
输出:'dddddeff'

样例3:

输入:s = "x3y1z"
输出:'xxxyz'

解决思路

  1. 逐个解析字符串
    遍历字符串时,逐一识别字符(字母)及其后面可能的数字(重复次数)。

  2. 判断数字的存在与大小

    • 若数字不存在,则默认该字符仅出现一次。
    • 若数字为正整数 n,则将该字符重复 n 次。
    • 若数字为0,则忽略该字符。
  3. 边遍历边构造解压结果
    使用一个列表存储解压后的字符片段,最后将列表拼接成字符串输出。

核心代码

以下是该问题的Python解决方案:

def solution(s: str) -> str:
    result = []  # 用于存储解压后的字符
    i = 0
    while i < len(s):
        char = s[i]  # 当前字母
        i += 1
        count = 0
        temp = ''
        while i < len(s) and s[i].isdigit():
            count = count * 10 + int(s[i])  # 可能有多位数字
            temp += s[i]
            i += 1
        if temp != '0':
            if count == 0:  # 没有数字,则只出现一次
                result.append(char)
            else:  # 有数字,则重复对应次数
                result.append(char * count)
    return ''.join(result)  # 将列表转为字符串并返回


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

核心知识点总结

  1. 字符串遍历与数字解析
    遍历字符串时,通过 isdigit() 判断字符是否为数字,并将连续数字拼接成多位数。

  2. 动态构造解压结果
    利用列表的 append() 方法按需添加字符,最后用 ''.join() 方法拼接成最终字符串。

  3. 边界条件处理

    • 字母后没有数字:默认重复一次。
    • 字母后数字为0:忽略该字母。
    • 支持多位数字:通过逐位累加构造完整的数字。

学习心得

  1. 逐步解析复杂字符串
    处理这种特殊字符串时,按规则逐步解析字符和数字,并在解析过程中构造结果。
  2. 注重边界条件
    特殊情况下的输入(如数字为0、多位数字)需要额外注意,写代码时要考虑全面。
  3. 分步验证
    解题过程中,逐步增加测试用例(如单字母、多位数字、含0等),确保代码在各类场景下的正确性。