中等LeetCode 394可逐步演示引导学习
字符串解码
栈:处理 k[encoded] 嵌套
用栈保存“进入括号前的字符串”和“当前重复次数”;遇到数字累积 k,遇到 [ 入栈,遇到 ] 弹出并重复当前内容,再拼回上一层。
时间复杂度 O(输出长度)空间复杂度 O(嵌套深度 + 输出长度)
题单:面试热题
题目描述
给定一个编码字符串,数字 k 后面跟着一对方括号,表示括号内的内容要重复 k 次。字符串中可能有多层嵌套,返回解码后的结果。
学习目标
能用栈处理嵌套编码,说清数字、左括号、右括号三种情况,并写出一次扫描的解码实现。
已完成 0 / 6 阶段
诊断
嵌套为什么不能用简单替换
遇到 2[3[a]],为什么不能先整体替换所有 3[a]?
建议先完成当前阶段(提示 / 检查 / 自评),再进入下一步;也可以直接跳过。
解题思路
核心思想
用栈保存“进入括号前的字符串”和“当前重复次数”;遇到数字累积 k,遇到 [ 入栈,遇到 ] 弹出并重复当前内容,再拼回上一层。
为什么需要它
嵌套括号意味着需要“先记住外层上下文”,等内层解码完再回到外层;这正是栈的后进先出。
第一反应:直觉方案
递归也能做:遇到 [ 就递归解析到对应 ],再把结果重复 k 次。本质和栈一样,只是用调用栈保存上下文。
关键洞察
关键洞察:每进入一层括号,当前已拼接的字符串和倍数都要先存起来;内层 ] 解码后,把结果重复并接到外层前缀上,再继续处理外层剩余字符。这样一次扫描就能处理任意嵌套。
时间复杂度 O(输出长度)空间复杂度 O(嵌套深度 + 输出长度)
易错点
- 数字可能有多位,要用 num = num * 10 + digit 累积。
- 遇到 [ 才把当前 current 和 num 入栈,并把它们清零/置空。
- 遇到 ] 时先弹出外层前缀和次数,再把 current.repeat(count) 接上。
- 普通字符直接拼到 current,不要入栈。
逐步演示
参考代码
1function decodeString(s) {
2 const stack = [];
3 let current = '';
4 let num = 0;
5
6 for (const ch of s) {
7 if (ch >= '0' && ch <= '9') {
8 num = num * 10 + Number(ch);
9 } else if (ch === '[') {
10 stack.push([current, num]);
11 current = '';
12 num = 0;
13 } else if (ch === ']') {
14 const [prefix, count] = stack.pop();
15 current = prefix + current.repeat(count);
16 } else {
17 current += ch;
18 }
19 }
20
21 return current;
22}
效果图
当前场景
第 1 / 10 步