1. 题目背景与核心挑战
LeetCode第301题"删除无效的括号"是算法面试中的经典难题,要求从包含括号和其他字符的字符串中,删除最少数量的无效括号,使剩下的字符串有效。这个问题看似简单,实则暗藏多个考察点:
- 括号匹配的经典算法延伸
- 回溯剪枝的效率优化
- 去重处理的巧妙实现
- 边界条件的全面考虑
我在实际面试中多次遇到这个问题的变种,也见过不少候选人在这里"翻车"。下面分享我经过多次优化后的Python解法,包含详细的思路解析和实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法思路与算法选择
2.1 暴力回溯法的局限
最直观的解法是生成所有可能的子序列,然后检查每个子序列是否有效。对于一个长度为n的字符串,这种暴力方法的时间复杂度是O(2^n),当n=25时计算量将达到3千多万次,显然不可行。
关键观察:我们只需要删除最少数量的括号,这意味着解的长度是固定的(原始长度减去最少删除数)
2.2 优化方向:BFS与剪枝
更聪明的做法是采用广度优先搜索(BFS):
- 从原始字符串开始,逐层删除1个、2个...括号
- 每层检查所有可能的删除组合
- 一旦发现有效字符串就停止搜索当前层
这种方法的时间复杂度优化为O(n^k),其中k是最少删除次数。对于典型测试用例,k通常很小。
3. Python实现详解
3.1 基础BFS实现
python复制from collections import deque
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
queue = deque([s])
visited = set([s])
foun
