【栈】No. 0394 字符串解码【中等】👉力扣对应题目指路
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述:给定一个经过编码的字符串,返回它解码后的字符串
-
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数
-
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入
-
示例 1:
输入:s = “3[a]2[bc]”
输出:“aaabcbc”
🔥 思路:构建辅助栈,由内向外拼接结果
- 可重点关注第七张,遇到
']'
时的出栈处理
res
存储[ ]
内的潜在字符串
- 所以每遇到
'['
则重置,重置前需要将 "当前括号外侧的倍数 & 当前括号外侧的字符串:[multi, res]
" 入栈
- 注意遇到
']'
前再次遇到了'['
说明有嵌套,所以此时res
的角色不是完整的[ ]
内的字符串,而是嵌套外层 (当前'['
括号外侧 ) 的字符串片段- 遇到
']'
时res
完整存储了当前']'
对应括号内的字符串,利用栈顶元素携带值拼接可获得外层括号内的完整字符串
- res = last_res + cur_multi * res
class Solution:
def decodeString(self, s: str) -> str:
stack, res, multi = [], "", 0
for c in s:
if c == '[': ## 收集并重置 当前括号外侧的倍数 & 字符串
stack.append([multi, res])
res, multi = "", 0
elif c == ']':
cur_multi, last_res = stack.pop()
## 根据遇到 ] 时候需要进行的操作,反推需要入栈什么信息
# 需要当前括号外侧的倍数 cur_multi、以及字符串 (不是全部) last_res
# res 为当前括号内的字符串
res = last_res + cur_multi * res
elif '0' <= c <= '9':
multi = multi * 10 + int(c)
else:
res += c
return res
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100