持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
1.题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
输入: n = 1
输出: ["()"]
2.思路
本题需要我们根据指定对数的括号来组合出所有有效的括号组合,有效的括号就意味着以左括号开头,并且能有对应的右括号进行结尾,所有的括号都满足整个提交的组合才是有效的组合。
我们可以通过递归的方法来向组合里面添加括号,然后判断当前左右括号的剩余个数,然后根据剩下的个数去递归添加括号。最终根据括号的个数来判断是否符合规则,当有一个左括号的时候我们就加1,有一个右括号的时候就减1,如果在我们遍历结束前值小于0的话那么就说明有右括号先于左括号出现,这是一个无效的括号组合,如果值等于0的时候就说明这是一个有效的括号组合。
首先通过递归尝试各种组合,然后在每一次递归的时候判断是否当前组合是否以右括号开头,然后当前组合长度达到输入个数的时候开始判断组合是否合法,然后继续根据当前剩余括号数量往里面添加括号,尝试各种组合。最终返回组合结果
3.代码
var generateParenthesis = function(n) {
let arr = ['(',')']
let res = []
//左右括号可用数量
let left = n
let right = n
let deep = (item)=>{
if(item===')')return
if(item.length===n*2){
let num = 0
left = n
right = n
for(let i = 0;i<item.length;i++){
if(item[i]==='('){
num+=1
}else{
num-=1
}
if(num<0){
return
}
}
if(num===0)res.push(item)
return
}
arr.forEach(el=>{
if(el==='('&&left!==0){
left-=1
deep(item.concat(el))
}
if(el===')'&&right!==0){
right-=1
deep(item.concat(el))
}
})
}
deep('')
return res
};