Python小练习系列 Vol.3:生成有效括号组合(回溯 + DFS)
🧠 Python小练习系列 Vol.3:生成有效括号组合(回溯 + DFS)
👋 本期我们来刷一道 LeetCode 热门经典题,借此掌握回溯算法的精髓 —— 生成有效括号组合,是学习递归 & DFS 的黄金题型!
🧩 一、题目描述
给定一个整数 n
,代表括号对的数量,请你生成所有格式正确的括号组合。
示例:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
🧠 二、解题思路
我们可以用「回溯 + 深度优先搜索(DFS)」的方法,逐步构建每一位括号组合。
合法组合规则:
- 左括号
(
的数量不能超过n
- 右括号
)
的数量不能超过左括号数量
回溯核心:
- 用递归函数 dfs(path, left, right)
- 当 path 满足长度条件时,将其加入结果
- 尝试添加
(
或)
,并继续向下探索
👨💻 三、Python代码实现
def generate_parentheses(n):
result = []
def dfs(path, left, right):
if len(path) == 2 * n:
result.append(path)
return
if left < n:
dfs(path + '(', left + 1, right)
if right < left:
dfs(path + ')', left, right + 1)
dfs('', 0, 0)
return result
📌 四、运行示例
print(generate_parentheses(3))
# 输出:['((()))', '(()())', '(())()', '()(())', '()()()']
🧩 五、解题思维小结
步骤 | 说明 |
---|---|
定义参数 | 当前构造字符串 path、左括号数 left、右括号数 right |
剪枝策略 | 左右括号数量必须符合规则 |
终止条件 | path 长度等于 2 * n 即为完整解 |
✅ 本题关键在于:控制递归分支合法性,避免冗余搜索
💡 六、进阶思考
- 💬 输出的括号组合可以按字典序排列吗?
- 🧠 用栈模拟生成过程,可视化 DFS?
- ⏱️ 如果限制时间/内存,如何提前剪枝?
❤️ 结语
回溯法很像在“决策树”中找答案,本题正是练习递归与剪枝的完美例子!
📌 下一期预告:迷宫寻路:回溯走迷宫(二维矩阵)
👉 点赞 👍 + 收藏 🌟,练好算法,刷题不慌!