1. 问题背景与核心挑战
LeetCode上"删除无效的括号"是一道经典的深度优先搜索(DFS)与剪枝优化结合的算法题,题目编号为301。给定一个由左右括号和其他字符组成的字符串,要求删除最少数量的无效括号,使剩下的字符串成为有效的括号组合,并返回所有可能的结果。
这个问题的难点在于:
- 需要处理多种无效情况(左括号多、右括号多、交错无效)
- 要求返回所有可能的有效解而非单一解
- 需要确保删除的括号数量最少
- 字符串长度可能达到25个字符,暴力解法会超时
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路解析
2.1 有效性判断原理
首先我们需要明确什么样的括号组合是有效的:
- 任意前缀中左括号数量 ≥ 右括号数量
- 最终左右括号数量相等
python复制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
2.2 关键优化思路
直接暴力枚举所有可能的子集显然不可行(时间复杂度O(2^n))。我们需要以下优化:
- 先计算需要删除的最少左右括号数量
- 在DFS过程中进行剪枝:
- 当前删除数量已超过最小值
- 当前前缀已不可能构成有效组合
- 避免重复解的处理
3. Python实现详解
3.1 预处理计算最小删除量
python复制def get_remove_counts(s):
l_remove = r_remove = 0
for char in s:
if char == '(':
l_remove += 1
elif char == ')':
if l_remove == 0:
r_remove += 1
else:
