新闻详情

新闻详情

首页 / 资讯中心 / 详情

LeetCode 301:删除无效括号的回溯算法优化实践

发布时间:2026/10/31 19:40:02来源:尧图网络
LeetCode 301:删除无效括号的回溯算法优化实践
1. 问题背景与核心挑战遇到需要从字符串中删除无效括号的编程问题时很多开发者会陷入暴力枚举的误区。这道LeetCode难题编号301的特别之处在于它要求我们找出所有可能的有效括号组合而不仅仅是判断有效性。问题的核心在于给定一个由括号和小写字母组成的字符串我们需要删除最少数量的无效括号使剩下的字符串成为有效的括号组合。这里的有效遵循标准定义——每个左括号必须有对应的右括号且整体嵌套关系正确。举个例子输入 ()())() 的有效解是 [()()(), (())()]输入 (a)())() 的有效解是 [(a)()(), (a())()]2. 解题思路分析与算法选择2.1 暴力法的局限性与优化方向最直观的解法是生成所有可能的子序列然后检查每个子序列是否有效。对于一个长度为n的字符串这种解法的时间复杂度是O(2^n)当n25时会有超过3300万种可能显然不可行。优化方向在于先计算出需要删除的最少左括号和右括号数量在回溯过程中应用这些信息进行剪枝避免生成重复的解2.2 关键预处理步骤在开始回溯前我们需要先扫描整个字符串计算出需要删除的多余左括号数(left_remove)和右括号数(right_remove)def calculate_removals(s): left_remove right_remove 0 for char in s: if char (: left_remove 1 elif char ): if left_remove 0: left_remove - 1 else: right_remove 1 return left_remove, right_remove这个预处理步骤的时间复杂度是O(n)能显著减少后续搜索空间。3. 回溯算法的实现细节3.1 基础回溯框架我们使用回溯算法来系统地探索所有可能的删除方案。算法的核心框架包括终止条件当字符串遍历完毕且需要删除的括号数为0时检查当前字符串是否有效选择与剪枝对于每个字符决定是否删除当它是多余括号时去重处理避免连续相同字符导致的重复解def removeInvalidParentheses(s): left_remove, right_remove calculate_removals(s) result set() def backtrack(index, left_count, right_count, left_rem, right_rem, expr): if index len(s): if left_rem 0 and right_rem 0: if is_valid(expr): result.add(.join(expr)) return char s[index] # 情况1删除当前字符如果是括号且还有需要删除的 if (char ( and left_rem 0) or (char ) and right_rem 0): backtrack( index 1, left_count, right_count, left_rem - (1 if char ( else 0), right_rem - (1 if char ) else 0), expr ) # 情况2保留当前字符 expr.append(char) if char not in (): backtrack(index 1, left_count, right_count, left_rem, right_rem, expr) elif char (: backtrack(index 1, left_count 1, right_count, left_rem, right_rem, expr) elif char ) and left_count right_count: backtrack(index 1, left_count, right_count 1, left_rem, right_rem, expr) expr.pop() backtrack(0, 0, 0, left_remove, right_remove, []) return list(result)3.2 有效性检查优化传统的有效性检查是使用栈结构但我们可以利用计数器进行优化def is_valid(s): balance 0 for char in s: if char (: balance 1 elif char ): balance - 1 if balance 0: return False return balance 0这种方法将O(n)空间复杂度降为O(1)在大数据量时性能更好。4. 性能优化与剪枝策略4.1 提前终止条件在回溯过程中我们可以添加几个提前终止的条件如果剩余的字符数不足以构建有效表达式当前长度 剩余字符 最大可能有效长度如果已经删除的括号数超过了预计算的最小删除数如果右括号数已经超过左括号数此时字符串已经无效4.2 去重处理的高级技巧当遇到连续相同的括号时我们可以强制按顺序处理避免生成重复解if index 0 and char s[index - 1]: # 如果是连续相同括号且前一个没被删除则跳过当前删除选项 if (char ( and left_rem 0) or (char ) and right_rem 0): # 只有当不是连续相同或者前一个被删除时才考虑删除当前字符 if not (expr and expr[-1] char): backtrack(...) # 删除当前字符的分支5. 完整优化后的Python实现结合所有优化策略最终的解决方案如下def removeInvalidParentheses(s): left_remove right_remove 0 # 计算需要删除的左右括号数 for char in s: if char (: left_remove 1 elif char ): if left_remove 0: left_remove - 1 else: right_remove 1 result set() def backtrack(index, left_count, right_count, left_rem, right_rem, expr): if index len(s): if left_rem 0 and right_rem 0: # 快速有效性检查 balance 0 for ch in expr: if ch (: balance 1 elif ch ): balance - 1 if balance 0: return if balance 0: result.add(.join(expr)) return char s[index] # 剪枝1剩余字符不足 remaining_chars len(s) - index if (char ( and left_rem 0) or (char ) and right_rem 0): removals left_rem right_rem if remaining_chars removals: # 选择删除当前字符 backtrack( index 1, left_count, right_count, left_rem - (1 if char ( else 0), right_rem - (1 if char ) else 0), expr ) # 选择保留当前字符 expr.append(char) if char not in (): backtrack(index 1, left_count, right_count, left_rem, right_rem, expr) elif char (: backtrack(index 1, left_count 1, right_count, left_rem, right_rem, expr) elif char ) and left_count right_count: backtrack(index 1, left_count, right_count 1, left_rem, right_rem, expr) expr.pop() backtrack(0, 0, 0, left_remove, right_remove, []) return list(result) if result else []6. 复杂度分析与实际测试6.1 时间复杂度分析最坏情况下算法的时间复杂度仍然是O(2^n)因为每个字符都有保留或删除两种选择。但在实际应用中通过剪枝和优化性能会好很多预处理步骤确定了必须删除的括号数大幅减少搜索空间有效性检查的优化减少了每个候选解的验证时间去重处理避免了重复计算对于典型输入实际运行时间往往接近O(n^k)其中k是需要删除的括号数。6.2 空间复杂度考虑空间消耗主要来自递归调用的栈深度O(n)存储中间表达式O(n)结果集合最坏情况下可能有指数级数量的解在实际应用中可以通过限制递归深度和优化存储方式来控制内存使用。7. 边界情况与特殊处理7.1 纯字母字符串当输入字符串不包含任何括号时直接返回原字符串if not any(c in () for c in s): return [s]7.2 全无效括号如)))(((这样的输入需要删除所有括号if left_remove len([c for c in s if c (]) and right_remove len([c for c in s if c )]): return [s.replace((, ).replace(), )]7.3 超大输入处理对于极长字符串超过100字符可以考虑分段处理并行计算设置超时机制8. 实际编码中的常见错误8.1 忘记处理连续相同括号# 错误示例 - 会导致重复解 if char ( and left_rem 0: backtrack(...) # 删除 backtrack(...) # 保留8.2 有效性检查不完整# 错误示例 - 只检查了括号平衡没检查删除数量 if is_valid(expr): result.add(expr) # 可能不是最优解8.3 递归参数传递错误# 错误示例 - 修改了可变对象但没恢复 expr char # 应该使用append和pop backtrack(...)9. 单元测试建议完整的解决方案应该包含以下测试用例test_cases [ (()())(), [()()(), (())()]), ((a)())(), [(a)()(), (a())()]), ()(, []), (n, [n]), ((((), [()]), (()())()), [()()(), ()(()), (())()]), ()(f, [f]), (()((((((((), [()()]), (((), [()]), ())((), [()]), ]10. 算法扩展与变种思考10.1 只要求一个有效解如果只需要返回任意一个有效解而不需要所有可能可以进一步优化从左到右扫描删除多余的右括号从右到左扫描删除多余的左括号时间复杂度降为O(n)10.2 带权重的括号删除如果不同位置的括号有不同的删除成本问题变为加权优化问题可以考虑动态规划解法。10.3 多类型括号的情况当有{}、[]、()多种括号时需要维护多个计数器并用栈来检查嵌套顺序的正确性。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/30 4:02:09

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/29 23:30:48

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/30 14:30:55

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/31 1:29:13

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/29 13:36:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/30 5:26:05

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉