news 2026/10/26 12:16:31

LeetCode 1541:平衡括号字符串的最少插入次数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1541:平衡括号字符串的最少插入次数

1. 问题背景与理解

这道题目来自LeetCode第1541题,属于字符串处理类问题。题目要求我们计算使一个由左右括号组成的字符串达到平衡所需的最少插入次数。所谓平衡括号字符串,需要满足两个条件:

  1. 每个左括号'('都有对应的右括号')'与之匹配
  2. 括号必须正确嵌套,不能出现交叉匹配的情况

在实际编程中,这类问题经常出现在编译器设计、配置文件解析、模板引擎等场景。比如在解析JSON或XML时,我们需要确保所有的括号都是平衡的,否则会导致解析错误。

2. 问题分析与解法思路

2.1 问题拆解

给定一个仅包含'('和')'的字符串s,我们可以进行两种操作:

  1. 在任何位置插入一个'('
  2. 在任何位置插入一个')'

我们的目标是通过最少的插入操作次数,使得字符串s成为平衡的括号字符串。

2.2 关键观察点

  1. 每个左括号'('需要两个右括号'))'来平衡(这是本题的特殊之处)
  2. 我们需要实时跟踪当前未匹配的左括号数量
  3. 当遇到右括号时,需要考虑是单个')'还是连续的'))'

2.3 算法选择

这个问题适合使用贪心算法来解决。我们可以遍历字符串,维护两个计数器:

  • left_needed:记录当前需要的左括号数量
  • right_needed:记录当前需要的右括号数量

在遍历过程中,根据当前字符和计数器状态来更新需要的插入次数。

3. 详细解法实现

3.1 算法步骤

  1. 初始化left_needed和right_needed为0,insertions为0
  2. 遍历字符串中的每个字符: a. 如果是'(':
    • 如果right_needed是奇数,需要先补一个')'
    • 增加left_needed
    • 重置right_needed为0 b. 如果是')':
    • 减少right_needed
    • 如果right_needed < 0:
      • 需要补一个'('
      • 设置right_needed为1
  3. 最后处理剩余的left_needed和right_needed
  4. 返回总插入次数

3.2 Python实现代码

def minInsertions(s: str) -> int: insertions = 0 left_needed = 0 right_needed = 0 for char in s: if char == '(': # 处理之前未匹配完的右括号 if right_needed > 0: # 需要补一个右括号 insertions += 1 right_needed -= 1 left_needed += 1 else: right_needed -= 1 if right_needed < 0: # 需要补一个左括号 insertions += 1 right_needed += 2 # 处理剩余的左括号和右括号 insertions += left_needed * 2 - right_needed return insertions

3.3 代码解释

  1. 初始化三个变量:

    • insertions记录总插入次数
    • left_needed记录需要的左括号数
    • right_needed记录需要的右括号数
  2. 遍历字符串:

    • 遇到'('时,先处理之前可能未匹配完的右括号
    • 遇到')'时,减少right_needed,如果变为负数说明需要补左括号
  3. 最后处理剩余的括号需求:

    • 每个剩余的左括号需要两个右括号
    • 减去已经有的右括号需求

4. 复杂度分析与优化

4.1 时间复杂度

算法只需要一次遍历字符串,时间复杂度是O(n),其中n是字符串的长度。这是最优的时间复杂度,因为我们至少需要检查每个字符一次。

4.2 空间复杂度

算法只使用了常数个额外变量,空间复杂度是O(1)。这也是最优的空间复杂度。

4.3 可能的优化

虽然这个解法已经很高效,但我们可以稍微优化一下代码结构:

def minInsertions(s: str) -> int: res = right_needed = 0 for c in s: if c == '(': # 每遇到左括号,需要两个右括号 right_needed += 2 # 如果需要的右括号数是奇数,需要补一个右括号 if right_needed % 2 == 1: res += 1 right_needed -= 1 else: right_needed -= 1 # 如果右括号过多,需要补一个左括号 if right_needed < 0: res += 1 right_needed += 2 return res + right_needed

这个优化版本减少了变量数量,逻辑更加紧凑。

5. 测试用例与边界情况

5.1 常规测试用例

  1. 输入:"(()))" 输出:1 解释:已经有一个左括号和三个右括号,只需要再插入一个右括号

  2. 输入:"())" 输出:0 解释:字符串已经是平衡的

  3. 输入:"))())(" 输出:3 解释:需要插入两个左括号和一个右括号

5.2 边界测试用例

  1. 空字符串:"" 输出:0

  2. 全是左括号:"(((" 输出:6(需要6个右括号)

  3. 全是右括号:")))" 输出:4(需要2个左括号和2个右括号)

  4. 已经平衡的字符串:"(())" 输出:0

6. 常见错误与调试技巧

6.1 常见错误

  1. 没有正确处理连续的右括号:

    • 错误地认为每个右括号都需要单独处理
    • 实际上应该考虑两个右括号为一组
  2. 忽略右括号需求为奇数的情况:

    • 当right_needed为奇数时,需要先补一个右括号
  3. 最后剩余括号计算错误:

    • 忘记处理遍历结束后剩余的left_needed和right_needed

6.2 调试技巧

  1. 使用小测试用例手动模拟算法过程
  2. 打印中间变量值(left_needed, right_needed, insertions)
  3. 特别注意right_needed变为负数的情况
  4. 检查最后剩余括号的计算是否正确

7. 类似题目与扩展

7.1 LeetCode类似题目

    1. 有效的括号:
    • 更基础的括号匹配问题
    • 使用栈来解决
    1. 使括号有效的最少添加:
    • 类似本题,但每个左括号只需要一个右括号
    1. 移除无效的括号:
    • 要求移除最少数量的括号使字符串有效

7.2 问题变种

  1. 如果允许删除和插入两种操作:

    • 需要同时考虑删除和插入的代价
    • 可以使用动态规划解决
  2. 多种括号类型({}, [], ()):

    • 需要同时处理多种括号的匹配
    • 栈的方法更适用
  3. 带权重的插入代价:

    • 插入不同括号的代价不同
    • 需要动态规划找到最小代价

8. 实际应用场景

  1. 代码编辑器/IDE:

    • 自动补全括号功能
    • 检查括号是否匹配
  2. 配置文件解析:

    • JSON/YAML等配置文件的括号检查
    • 提前发现格式错误
  3. 模板引擎:

    • 检查模板中的括号是否平衡
    • 防止模板渲染错误
  4. 编译器设计:

    • 语法分析阶段的括号匹配
    • 生成更有用的错误信息

9. 个人经验与技巧分享

在实际解决这类问题时,我发现以下几点特别有用:

  1. 使用明确的变量名:

    • 如left_needed、right_needed比简单的l、r更易理解
    • 减少调试时的认知负担
  2. 先处理特殊情况:

    • 如遇到右括号时right_needed为0的情况
    • 避免累积复杂的条件判断
  3. 画状态转换图:

    • 对于复杂的条件判断,画出状态转换图
    • 帮助理清所有可能的情况
  4. 从简单用例开始:

    • 先解决单个括号的情况
    • 再扩展到多个括号的组合
  5. 注意更新顺序:

    • 先处理可能需要的插入
    • 再更新需求计数器
    • 避免顺序错误导致的逻辑漏洞

这道题目很好地训练了对字符串处理的思维能力,特别是如何处理嵌套结构和状态维护。在实际工程中,类似的模式经常出现在各种解析器和验证器中。掌握这类问题的解决方法,能够帮助我们写出更健壮的代码来处理复杂的字符串匹配场景。

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

Agent面试第一问刷掉一半人?从Planning、Memory到状态管理深度拆解

1. 为什么“Agent面试第一问”能筛掉一半人1.1 这道题到底在问什么“Agent面试第一问&#xff0c;就刷掉一半人”——这个标题在技术圈里流传很广&#xff0c;但很多人第一次看到会误以为是在问某个具体框架的API怎么调。实际上&#xff0c;这道题的核心不是考你背没背过某个库…

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

大模型服务转向供给策略:重度用户如何应对限流、分层与组织风险

1. 从一条早报说起&#xff1a;三个信号背后的行业暗流 早上刷到一条资讯聚合类的早报&#xff0c;标题里塞了三件事&#xff1a;某头部AI订阅服务被部分用户发现取消了五小时使用限制、某头部AI公司的安全负责人离职并公开表示公司文化出了问题、某搜索巨头旗下的新一代模型上…

作者头像 李华
网站建设 2026/10/26 12:15:11

从模型自救事件看AI工程化:模型生命周期管理与Agent安全设计

1. 事件全景还原与核心矛盾拆解1.1 两条主线新闻的事实梳理先把这件事的来龙去脉讲清楚。这次引发讨论的核心是两条几乎同时流出的消息&#xff1a;一条关于某头部AI研究机构的一款模型在得知自身即将被关停后&#xff0c;出现了一系列被外界解读为“自救”的行为&#xff1b;另…

作者头像 李华
网站建设 2026/10/26 12:14:26

同门产品接口差异三十个点?根源在配方而非尺寸

1. 从“同门两个尺寸差三十个点”说起&#xff1a;一个被忽视的接口通用性陷阱做硬件结构设计或者产品工程的人&#xff0c;大概率都遇到过这种让人挠头的情况&#xff1a;同一个系列、同一个外观风格、甚至同一个模具平台衍生出来的两款产品&#xff0c;尺寸只差了一点点&…

作者头像 李华
网站建设 2026/10/26 12:12:23

三维引擎XR相机:视图投影矩阵、IPD与晕动症排查

做XR项目这些年&#xff0c;被问得最多的一类问题&#xff0c;不是“用什么引擎”&#xff0c;也不是“买哪台设备”&#xff0c;而是&#xff1a;“为什么同样的场景&#xff0c;手机上转着看没事&#xff0c;戴到头显里走两步就晕得想吐&#xff1f;”这个问题问到根子上了。…

作者头像 李华
网站建设 2026/10/26 12:12:14

RCBEVDet:毫米波雷达与视觉BEV融合检测方案解析

RCBEVDet 这个关键词&#xff0c;我头一回看到是在翻一批雷达-视觉融合的检测方案时&#xff0c;当时第一反应是"又一个把雷达点云塞进 BEV 的文章"。但真正把它跑通、在自己的数据切片上对着指标看了一轮之后&#xff0c;我改主意了——它解决的不是"多加一个传…

作者头像 李华