leetcode-括号生成

categories: [计算机通识,数据结构与算法]
thumbnail: /images/fe/leetcode.jpg
toc: true

括号生成(难度:中等)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

这道题的比较好的解法就是深搜+回溯的算法。我们设置一个path用于保存路径,那么递归的终点就显而易见了:当path的长度为n的两倍,那么这个时候就代表已经找出了一条符合要求的解,直接保存下来就可以了。

当path长度小于n的两倍,说明还可以往里面放括号,这个时候有两种情况,左括号的数量小于n,说明这个时候还可以继续放左括号。第二种情况,右括号的数量小于左括号的数量,说明这个时候可以放右括号。需要注意的是,这两种情况不是互斥的,而是需要顺序执行

那么我们就可以对放左括号和右括号进行递归,为了实现回溯,我们每一次递归完,都需要回退当前情况下的path和左右括号的放置情况

代码如下:

var generateParenthesis = function(n) {
    let res = [],
    arr = new Array(n)

    for(let i = 0; i < n; i++){
        arr[i] = '('
    }
    dfs(n, res, [], [], [])
    return res.map(v => {
        return v.join('')
    })
};
function dfs(n, res, path, left, right){
    if(path.length === n * 2){
        res.push(JSON.parse(JSON.stringify(path)))
        return 0
    }
    if(left.length < n){
        path.push('(')
        left.push('(')
        dfs(n, res, path, left, right)
        path.pop()
        left.pop()
    }
    if(right.length < left.length){
        path.push(')')
        right.push(')')
        dfs(n, res, path, left, right)
        path.pop()
        right.pop()
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值