这道题的目的是实现一个字符串解压缩函数
solution(s: str) -> str,其中输入字符串 s 采用了一种特定的压缩格式。每个字母后面可能会跟随一个数字,表示该字母在解压后的字符串中需要重复出现的次数;如果字母后面没有数字,则默认该字母只出现一次。
题目分析
- 输入格式:字符串中每个字母后面可以跟一个数字,表示该字母要重复的次数。
- 输出格式:解压后的字符串,将字母按指定的次数重复排列。
- 特例处理:若数字为
0,表示删除前一个字符。
解题思路
- 遍历字符串:逐个字符扫描字符串
s。 - 识别字母:如果当前字符是字母(不是数字),直接将其添加到结果列表
res中。 - 识别数字:如果当前字符是数字,继续读取后续的数字字符,拼接为一个完整的数字。
- 将此数字转换为整数
temp,如果temp == 0,删除结果中的最后一个字符;否则,将前一个字母重复temp - 1次添加到结果列表。
- 将此数字转换为整数
- 拼接输出:遍历结束后,将
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。
通过这些测试用例,可以验证该解法的正确性和有效性。