0
点赞
收藏
分享

微信扫一扫

生成匹配的括号「leetcode」

墨香子儿 2022-05-03 阅读 39

这道题要生成所有合法的括号情况,可以看到n的数值范围在[1,8]非常小,所以可以一个一个的搜索。

第一种是用DFS把每种情况都搜索一波,留下合法的所有情况

var generateParenthesis = function(n) {
    // DFS回溯思路
    // 每次添加一个括号,左边和右边,其实这个题目的难点就在于建模
    let res = []
    dfs(0,0,"")
    return res
    function dfs(open,close,cur){
        // 特判不满足条件的
        if( open > n || close > n || close > open ){
            return
        }
        if(open === n && close === n){
            res.push(cur)
            return
        }
        // 用左和右来区分其实就相当于push--pop
        curLeft = cur + '('
        dfs(open+1,close,curLeft)
        curRight = cur + ')'
        dfs(open,close+1,curRight)
    }
};

第二种是用BFS进行搜索,然后用Set的数据结构来去重

var generateParenthesis = function(n) {
    // 思路是从开始往后面不断的去推导
    let set = new Set(['()'])
    // 有几个括号就循环几次
    // 最开始已经初始化过了
    for(let i=2;i<=n;i++){
        let nextSet = new Set()
        // 取set中的元素来做的
        for(let s of set){
            for(j=0;j<s.length;j++){
                nextSet.add(s.slice(0,j) + '()' + s.slice(j))
            }
        }
        set = nextSet
    }
    // 这里表示全部展开
    return [...set]
};
举报

相关推荐

0 条评论