news 2026/10/27 6:34:31

LeetCode 394:栈结构实现字符串解码算法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 394:栈结构实现字符串解码算法详解

1. 问题背景与需求分析

字符串解码是算法面试中的经典题型,在LeetCode题库中被标记为中等难度(题号394)。这道题出现在Hot100榜单中,说明它是高频考点,考察求职者对栈结构的灵活应用能力。

题目要求我们实现一个解码规则:当遇到形如k[encoded_string]的模式时,需要将encoded_string重复k次。这种嵌套结构可能有多层,例如3[a2[c]]应该被解码为accaccacc。

2. 核心解题思路解析

2.1 栈结构的适用性分析

这类嵌套结构解析问题,栈是最自然的选择:

  • 遇到[时压栈当前状态
  • 遇到]时弹栈处理
  • 需要同时保存重复次数和已解码字符串
def decodeString(s: str) -> str: stack = [] current_str = "" current_num = 0

2.2 字符处理的四种情况

遍历字符串时需要区分四种情况:

  1. 数字字符:累积计算重复次数
  2. 字母字符:拼接到当前字符串
  3. [符号:保存当前状态到栈
  4. ]符号:弹栈并处理嵌套结构

特别注意数字可能有多位(如"100[leetcode]"),需要用isdigit()判断并累积计算

3. 完整算法实现与注释

3.1 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 + num * current_str else: current_str += char return current_str

3.2 关键步骤说明

  1. 数字处理:遇到连续数字时,通过current_num = current_num * 10 + int(char)实现多位数的解析
  2. 压栈时机:遇到[时将当前字符串和数字作为元组压栈,然后重置状态
  3. 弹栈处理:遇到]时取出栈顶的字符串和数字,进行字符串拼接

4. 复杂度分析与优化

4.1 时间复杂度

  • 最坏情况:O(n×k),其中n是字符串长度,k是最大重复次数
  • 示例:对于10[a10[b10[c]]],需要处理10×10×10次拼接

4.2 空间复杂度

  • 栈的最大深度取决于嵌套层数
  • 最坏情况:O(n)(当所有字符都是[或]时)

5. 常见错误与调试技巧

5.1 典型错误案例

  1. 数字累积错误:

    # 错误写法 current_num = int(char) # 只能处理单位数
  2. 栈操作顺序错误:

    # 错误写法 stack.append((current_num, current_str)) # 顺序反了会导致类型错误

5.2 调试建议

  1. 使用简单测试用例验证:

    • "3[a]2[bc]"→"aaabcbc"
    • "2[abc]3[cd]ef"→"abcabccdcdcdef"
  2. 打印栈状态辅助调试:

    print(f"Push: {current_str}, {current_num}")

6. 变种问题与扩展思考

6.1 支持转义字符

如果输入字符串包含转义字符(如\),需要额外处理:

elif char == '\\': i += 1 current_str += s[i]

6.2 递归解法实现

虽然栈解法更直观,但也可以使用递归:

def decodeString(s, i=0): res = "" while i < len(s) and s[i] != ']': if not s[i].isdigit(): res += s[i] i += 1 else: num = 0 while i < len(s) and s[i].isdigit(): num = num * 10 + int(s[i]) i += 1 i += 1 # skip '[' decoded, i = decodeString(s, i) i += 1 # skip ']' res += num * decoded return res, i

在实际面试中,建议优先展示栈解法,因为递归解法可能因为嵌套过深导致栈溢出,且空间复杂度不易优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 6:34:19

冷链追溯系统实战:SSM+MySQL+Java如何搭建全链路追溯模型

简介&#xff1a;一套基于SSM框架的冷链物流追溯系统毕业设计项目&#xff0c;面向计算机、软件工程、大数据等专业学生与开发者&#xff0c;适用于毕业设计、期末大作业或课程设计。系统采用Java和MySQL实现&#xff0c;融合软件工程导论、数据库原理、Java高级程序设计等课程…

作者头像 李华
网站建设 2026/10/27 6:34:04

机器学习学术速递实战:图神经网络与ADMM在节点分类中的深度拆解

1. 从"学术速递"这个栏目说起&#xff1a;为什么值得单独做一期拆解做机器学习方向的朋友大概都有个共同的痛点&#xff1a;这个领域更新太快了。快到什么程度&#xff1f;你上周刚把某篇图神经网络的论文读完&#xff0c;这周就冒出来三篇改进版本&#xff0c;而且每…

作者头像 李华
网站建设 2026/10/27 6:33:36

WorkBuddy 跨行业落地指南:六大真实场景与 MCP 飞书集成实践

1. 从六个真实场景看 WorkBuddy 的落地逻辑WorkBuddy 这个工具最近在圈子里被讨论得越来越多&#xff0c;但很多人第一次听到它时的反应都是“又一个效率工具&#xff1f;”——我一开始也这么想。直到我把《WorkBuddy 行业应用指南》第二期里那六个跨行业案例从头到尾拆了一遍…

作者头像 李华
网站建设 2026/10/27 6:32:54

SpringBoot集成ECharts实现新闻可视化与词频分析平台

简介&#xff1a;一套基于SpringBoot与ECharts的新闻可视化分析平台源码数据库&#xff0c;面向Java Web开发者与数据可视化学习者。平台整合新闻数据采集、存储、统计分析到图表展示的完整流程&#xff0c;覆盖SpringBoot分层架构、持久层映射、RESTful接口以及ECharts动态渲染…

作者头像 李华
网站建设 2026/10/27 6:32:36

基于领域本体的Java大模型网关:七模型智能路由与提示词组装实战

1. 从“荒天帝炼大模型网关”说起&#xff1a;这个项目到底在做什么“荒天帝炼大模型网关-第3境-化灵境-原始真解-领域本体重塑”&#xff0c;这个标题第一次看到的时候&#xff0c;我脑子里蹦出来的画面是修仙小说里主角在洞府里闭关&#xff0c;把一块粗糙的灵石反复淬炼&…

作者头像 李华
网站建设 2026/10/27 6:32:15

Pandas筛选与过滤全解析:布尔索引、loc/iloc与query

1. 为什么"筛选"是Pandas里最不该被低估的一步1.1 从一次逐行判断的返工说起前阵子帮一位做运营分析的同行看代码&#xff0c;他想从一张几万行的订单表里挑出"区域A且金额大于100且状态为已支付"的记录&#xff0c;写出来的东西是这样的&#xff1a;先ite…

作者头像 李华