22. 括号生成(中)
题目
- 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
python
题解:回溯+剪枝
- 首先翻译一下题目:现在有2n个位置,每个位置可以放'('或者')',组成的所有括号组合中,有多少个是合法的?并保存输出。
- 思路:先把所有的括号组合穷举出来,在筛选合法的即可
- 合法的性质:左括号数量等于右括号;对于一个合法的括号字符串p,必然对于任何0<=i<len(p)都有:子串p[0...i]中的左括号数量都大于等于右括号数量
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def backtrack(left: int, right: int, track: List[str], res: List[str]):
# 如果右括号数目小于左括号数目,说明当前组合是无效的,直接返回
if right < left:
return
# 如果左括号或右括号的数目小于 0,说明当前组合是无效的,直接返回
if left < 0 or right < 0:
return
# 如果左括号和右括号的数目都为 0,说明找到了一个有效的括号组合,将其加入结果列表 res 中
if left == 0 and right == 0:
res.append("".join(track))
return
# 尝试添加一个左括号到当前组合中,并进行递归调用
track.append('(')#选择
backtrack(left - 1, right, track, res)
track.pop() # 回溯,移除最后添加的左括号
# 尝试添加一个右括号到当前组合中,并进行递归调用
track.append(')')#选择
backtrack(left, right - 1, track, res)
track.pop() # 回溯,移除最后添加的右括号
if n == 0:
return []
track = [] # 用于追踪当前的括号组合
res = [] # 保存有效的括号组合
backtrack(n, n, track, res) # 调用回溯函数生成括号组合
return res # 返回结果列表
javascript
题解:回溯
var generateParenthesis = function(n) {
const res = [] // 存放结果的数组
const track = [] // 当前路径的数组
const dfs=(left,right)=>{
//递归出口,当左右括号都用完时,将当前组合加入结果集
if(left === 0 && right ===0){
res.push(track.join(''))
return
}
//做选择,选左括号还是右括号,选择右括号的限制条件是前面有左括号
// 选择左括号:如果还有左括号可以用
if(left>0){
track.push('(')// 做选择,加入左括号
dfs(left-1, right)// 递归调用,减少一个左括号
track.pop() // 撤销选择,回溯
}
// 选择右括号:如果右括号的数量大于左括号的数量
if(right>left){
track.push(')')// 做选择,加入右括号
dfs(left,right-1)// 递归调用,减少一个右括号
track.pop()// 撤销选择,回溯
}
}
dfs(n,n)// 初始化,左右括号的数量都为 n
return res
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人