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

68 阅读3分钟

问题描述

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

问题理解

本题要求对一种特殊压缩格式的字符串进行解压操作。压缩字符串中每个字母后可能紧跟一个数字,这个数字表示该字母在解压后应重复的次数;若字母后无数字,则该字母在解压字符串中仅出现一次。

算法步骤

  1. 初始化

    • 创建一个空字符串 result 用于存储解压后的结果。
    • 使用一个索引 i 来遍历输入字符串 s
  2. 遍历字符串

  • 在循环中:通过 s[i].isalpha() 判断是否为字母。
  • 收集数字部分时,使用内层循环 while i < len(s) and s[i].isdigit(): 来拼接数字字符串 num_str
  • 计算重复次数 num 时,使用三元表达式 int(num_str) if num_str else 1 简洁地处理了数字字符串为空的情况。
    • 如果当前字符 s[i] 是字母:
      • 记录当前字母 char
      • 初始化一个空字符串 num_str 用于存储后续的数字部分。
      • 继续向后遍历,直到遇到非数字字符或字符串结束。
      • num_str 转换为整数 num,如果 num_str 为空,则 num 默认为1。
      • 将字母 char 重复 num 次后添加到 result 中。
    • 如果当前字符 s[i] 不是字母(即数字或其他字符),则跳过该字符。
  1. 返回结果
    • 遍历结束后,返回 result 作为最终的解压结果。

边界条件

  • 确保在遍历字符串时,不会越界。
  • 处理字符串末尾的情况,确保最后一个字母及其对应的数字(如果有)能够正确处理。

代码实现

7b1b4b8992e197ca25d15d30cdb2223.png

MarsCode代码分析与修改建议:

  1. 逻辑问题

    • 当前代码在处理字母和数字时,存在逻辑上的问题。特别是当遇到数字时,我重复了 result 的最后一个字符,而不是当前的字母。
  2. 边界条件

    • 代码没有处理字母后面没有数字的情况,导致逻辑错误。

修改建议

  1. 处理字母和数字的逻辑

    • 当遇到一个字母时,应该记录下这个字母。
    • 当遇到一个数字时,应该将这个字母重复相应的次数,并添加到结果字符串中。
  2. 边界条件

    • 确保在字母后面没有数字的情况下,字母只出现一次。

修改后的代码

def solution(s: str) -> str:
    result = ""
    i = 0
    while i < len(s):
        if s[i].isalpha():
            char = s[i]
            i += 1
            num_str = ""
            while i < len(s) and s[i].isdigit():
                num_str += s[i]
                i += 1
            num = int(num_str) if num_str else 1
            result += char * num
        else:
            i += 1
    return result

测试样例

样例1:

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

样例2:

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

样例3:

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

总结

通过以上步骤,我们可以实现逐步构建解压后的字符串。这个算法的时间复杂度是 O(n),其中 n 是输入字符串的长度,因为每个字符最多被访问两次(一次用于判断字母,一次用于读取数字)。空间复杂度主要取决于结果字符串的长度,最坏情况下为解压后的字符串长度,也为 O(n)。AI刷题真是个好工具。