1. 题目背景与核心挑战
LeetCode上"删除无效的括号"是一道经典的字符串处理题目,编号为301。题目要求从给定的字符串中删除最少数量的无效括号,使得剩下的字符串成为有效的括号组合。这道题在Facebook、Amazon等大厂面试中出现频率较高,属于中等偏上难度的回溯算法应用题。
我第一次遇到这个问题时,被它的多重解法和各种边界条件处理弄得头疼。经过多次实践后,我发现用Python实现时有几个关键点需要特别注意:如何高效地检查括号有效性、怎样避免重复计算、以及如何优化剪枝策略。下面我就结合自己的踩坑经验,分享一套完整的Python解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解法思路
2.1 有效括号的定义
首先我们需要明确什么样的括号组合是有效的:
- 左括号和右括号数量相等
- 在任何前缀子串中,左括号数量不少于右括号
- 括号必须正确嵌套
例如:"()()()"和"(())()"都是有效的,而")("和"(()"则是无效的。
2.2 暴力解法的局限性
最直观的想法是生成所有可能的子串,然后检查有效性。对于一个长度为n的字符串,子串数量是2^n,当n=25时,这显然不可行。我们需要更聪明的办法。
2.3 回溯算法的优化思路
通过分析无效括号的两种情况(多余左括号或右括号),我们可以分两步处理:
- 首先从左到右扫描,删除多余的右括号
- 然后从右到左扫描,删除多余的左括号
这种方法的时间复杂度可以优化到O(2^n),在实际测试中表现良好。
3. Python实现详解
3.1 基础实现代码
python复制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
