这道LeetCode Hot100题目编号394,标题为"字符串解码",难度中等。题目要求我们实现一个能够解析特定格式编码字符串的算法。这类字符串编码规则在现实开发中非常常见,比如配置文件解析、模板引擎处理、数据压缩传输等场景都会用到类似的嵌套结构解析。
编码字符串的格式定义为:数字[字符串]的重复组合。例如:
最直观的想法可能是使用递归解法:遇到数字就解析重复次数,遇到括号就递归处理内部字符串。这种方法虽然直观,但存在两个明显问题:
栈结构特别适合处理这种具有嵌套特性的问题,因为它完美匹配了"后进先出"的嵌套解析顺序。在本题中,我们需要同时处理两种类型的数据:
这提示我们需要设计一个能够同时保存这两种信息的栈结构。
python复制def decodeString(s: str) -> str:
stack = []
current_str = ""
current_num = 0
for char in s:
if char.isdigit():
current_num = current_num * 10 + int(char)
elif char == '[':
stack.append((current_str, current_num))
current_str = ""
current_num = 0
elif char == ']':
prev_str, num = stack.pop()
current_str = prev_str + current_str * num
else:
current_str += char
return current_str
数字处理:
current_num = current_num * 10 + int(char)实现数字的累积计算左括号处理:
右括号处理:
普通字符处理:
python复制test_cases = [
("3[a]", "aaa"),
("3[a2[c]]", "accaccacc"),
("2[abc]3[cd]ef", "abcabccdcdcdef"),
("10[a]", "aaaaaaaaaa"),
("1[a1[b1[c]]]", "abc"),
("", ""),
("abc", "abc"),
("3[a]2[b4[F]c]", "aaabFFFFcbFFFFc")
]
数字解析不完整:
current_num = current_num * 10 + int(char)栈操作顺序错误:
字符串拼接顺序错误:
prev_str + current_str * num如果要支持更复杂的编码规则,如:
这时可以考虑:
这种字符串解码算法在以下场景中有实际应用:
配置文件解析:
模板引擎:
数据压缩:
为了巩固栈的应用技巧,推荐练习以下LeetCode题目:
在实际编码中有几个关键点值得注意:
数字累积技巧:
current_num = current_num * 10 + int(char)比字符串拼接再转换更高效栈元素设计:
状态管理:
Python优化技巧: