问题描述
小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。
问题理解
本题要求对一种特殊压缩格式的字符串进行解压操作。压缩字符串中每个字母后可能紧跟一个数字,这个数字表示该字母在解压后应重复的次数;若字母后无数字,则该字母在解压字符串中仅出现一次。
算法步骤
-
初始化:
- 创建一个空字符串
result用于存储解压后的结果。 - 使用一个索引
i来遍历输入字符串s。
- 创建一个空字符串
-
遍历字符串:
- 在循环中:通过
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]不是字母(即数字或其他字符),则跳过该字符。
- 如果当前字符
- 返回结果:
- 遍历结束后,返回
result作为最终的解压结果。
- 遍历结束后,返回
边界条件
- 确保在遍历字符串时,不会越界。
- 处理字符串末尾的情况,确保最后一个字母及其对应的数字(如果有)能够正确处理。
代码实现
MarsCode代码分析与修改建议:
-
逻辑问题:
- 当前代码在处理字母和数字时,存在逻辑上的问题。特别是当遇到数字时,我重复了
result的最后一个字符,而不是当前的字母。
- 当前代码在处理字母和数字时,存在逻辑上的问题。特别是当遇到数字时,我重复了
-
边界条件:
- 代码没有处理字母后面没有数字的情况,导致逻辑错误。
修改建议
-
处理字母和数字的逻辑:
- 当遇到一个字母时,应该记录下这个字母。
- 当遇到一个数字时,应该将这个字母重复相应的次数,并添加到结果字符串中。
-
边界条件:
- 确保在字母后面没有数字的情况下,字母只出现一次。
修改后的代码
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刷题真是个好工具。