ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LeetCode 301题解析:回溯算法删除无效括号

LeetCode 301题解析:回溯算法删除无效括号 1. 题目背景与核心挑战LeetCode 301题删除无效的括号是一道经典的字符串处理与回溯算法结合的题目。给定一个由左右括号和其他字符组成的字符串要求删除最少数量的无效括号使剩下的字符串成为有效的括号组合并返回所有可能的结果。这个问题的难点在于需要同时处理多种无效情况左括号多余、右括号多余、括号不匹配要求返回所有可能的有效解而非单一解需要确保删除的括号数量最少需要处理字符串中非括号字符的存在2. 问题分析与解法思路2.1 无效括号的判定逻辑首先我们需要明确什么样的括号组合是无效的。从左到右扫描字符串时当右括号数量超过左括号时立即无效最终左括号和右括号数量不等括号嵌套关系混乱2.2 暴力解法的局限性最直观的解法是生成所有可能的子字符串然后检查每个子串的有效性。但这种方法的时间复杂度是O(2^n)对于长度超过20的字符串就不可行了。2.3 优化思路回溯剪枝我们可以采用回溯算法在遍历字符串时跟踪当前左括号和右括号的数量当发现无效情况时尝试删除当前括号通过剪枝避免重复计算3. Python实现详解3.1 基础回溯实现def removeInvalidParentheses(s): def is_valid(s): count 0 for char in s: if char (: count 1 elif char ): count - 1 if count 0: return False return count 0 level {s} while True: valid list(filter(is_valid, level)) if valid: return valid next_level set() for item in level: for i in range(len(item)): if item[i] in (): next_level.add(item[:i] item[i1:]) level next_level3.2 优化后的回溯解法def removeInvalidParentheses(s): res [] def backtrack(s, start, last_remove, left, right, path): balance 0 for i in range(start, len(s)): if s[i] (: balance 1 elif s[i] ): balance - 1 if balance 0: continue # 发现右括号多余 for j in range(last_remove, i1): if s[j] ) and (j last_remove or s[j-1] ! )): backtrack(s[:j]s[j1:], i, j, left, right, path) return # 处理左括号多余的情况 reversed_s s[::-1] if left right: backtrack(reversed_s, 0, 0, right, left, path) elif left right: res.append(path reversed_s[::-1]) backtrack(s, 0, 0, 0, 0, ) return list(set(res)) if res else []4. 关键算法细节解析4.1 平衡计数器的工作原理平衡计数器是判断括号有效性的核心遇到(时计数器1遇到)时计数器-1任何时候计数器为负都表示无效最终计数器应为04.2 剪枝策略的实现为了避免重复计算和无效路径记录上次删除的位置确保不会重复删除相同位置的括号当连续多个相同括号时只删除第一个以避免重复解先处理右括号多余的情况再反转处理左括号多余4.3 时间复杂度分析最优情况下时间复杂度为O(n^k)其中k是需要删除的括号数量。相比暴力解法的O(2^n)有了显著提升。5. 边界情况处理5.1 空字符串输入直接返回包含空字符串的列表[]5.2 无括号字符串原样返回字符串本身5.3 全无效括号如)))(((需要删除所有括号返回[]5.4 包含非括号字符非括号字符不影响判断应保留在结果中6. 测试用例设计完整的测试应包含test_cases [ (()())(), [(())(),()()()]), ((a)())(), [(a())(),(a)()()]), ()(, []), (n, [n]), ((((), [()]), (()()())), [()()()]), ()(f, [f]) ]7. 常见错误与调试技巧7.1 重复解问题使用集合(set)存储结果自动去重7.2 超时问题确保实现了有效的剪枝策略特别是对于长字符串7.3 漏解问题检查是否正确处理了连续相同括号的情况7.4 非括号字符处理确保算法不会误删非括号字符8. 算法优化方向可以先用一次遍历计算出需要删除的左括号和右括号的最小数量使用记忆化存储中间结果避免重复计算对于特别长的字符串可以考虑迭代加深的DFS并行处理不同分支加速计算9. 实际应用场景这种算法可以应用于代码编辑器的自动括号补全和修正配置文件语法检查数学表达式验证文本处理中的结构化数据提取10. 扩展思考如果要求删除任意k个括号而非最少数量如何修改算法如果括号有不同类型({},[],())如何扩展解法如何实时检测并提示字符串中第一个无效括号的位置如何修改算法使其适用于流式数据输入
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进