问题描述
小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。
测试样例
样例1:
输入:
s = "a2b3c4"
输出:'aabbbcccc'
样例2:
输入:
s = "d5ef2"
输出:'dddddeff'
样例3:
输入:
s = "x3y1z"
输出:'xxxyz'
解决思路
-
逐个解析字符串
遍历字符串时,逐一识别字符(字母)及其后面可能的数字(重复次数)。 -
判断数字的存在与大小
- 若数字不存在,则默认该字符仅出现一次。
- 若数字为正整数 n,则将该字符重复 n 次。
- 若数字为0,则忽略该字符。
-
边遍历边构造解压结果
使用一个列表存储解压后的字符片段,最后将列表拼接成字符串输出。
核心代码
以下是该问题的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')
核心知识点总结
-
字符串遍历与数字解析
遍历字符串时,通过isdigit()判断字符是否为数字,并将连续数字拼接成多位数。 -
动态构造解压结果
利用列表的append()方法按需添加字符,最后用''.join()方法拼接成最终字符串。 -
边界条件处理
- 字母后没有数字:默认重复一次。
- 字母后数字为0:忽略该字母。
- 支持多位数字:通过逐位累加构造完整的数字。
学习心得
- 逐步解析复杂字符串
处理这种特殊字符串时,按规则逐步解析字符和数字,并在解析过程中构造结果。 - 注重边界条件
特殊情况下的输入(如数字为0、多位数字)需要额外注意,写代码时要考虑全面。 - 分步验证
解题过程中,逐步增加测试用例(如单字母、多位数字、含0等),确保代码在各类场景下的正确性。