持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入: n = 1
输出: ["()"]
提示:
1 <= n <= 8
解题思路
本题要求我们根据给出的整数 n 生成所有可能且有效的括号组合。根据题意可以,数字 n 就是生成括号的对数,表示我们有 n 个 ( 和 n 个 ) 可用。
而组合结果的过程,无非就两种可能,要么再拼一个 (,要么再拼一个 ),所以我们在括号没有用完的时候,不停选择左右括号进行组合即可,当左右括号都用完,则完成一组可能的结果,将其添加到结果数组中即可。
因为是不停选择左括号或者右括号进行组合,所以很适合用递归来实现。
首先我们明确递归函数的退出条件是左右括号都用完。
其次,因为要保证括号组合有效,所以当剩余左右括号数量相同时,这个时候,要保证下一个拼接的一定是左括号。
所以我们的递归函数需要传入四个参数:
- 左括号剩余数量
- 右括号剩余数量
- 当前拼接字符串结果
- 结果数组 最后,调用该函数,并返回其返回值即可。
代码实现
function getRes(l,r,str,res){
if(l === 0 && r === 0){
res.push(str)
return
}
if(l === r){
getRes(l-1,r,str+'(',res)
}else{
if(l){
getRes(l-1,r,str+'(',res)
}
if(r){
getRes(l,r-1,str+')',res)
}
}
return res
}
var generateParenthesis = function(n) {
return getRes(n,n,'',[])
}
至此我们就完成了 leetcode-22-括号生成
如有任何问题或建议,欢迎留言讨论!