LeetCode(22):括号生成

题目描述

image

解题思路

我们可以将问题改写成:
现在有2n个位置,每个位置可以放 ( 或者 ),组成的所有括号组合中,哪些是合法的?
解决这个问题只需要分2步:

  1. 暴力枚举所有可能的情况,共有2的2n次方
  2. 在做选择之前,进行“剪枝”

1、暴力枚举

只需要直接套用回溯算法的框架即可:

  • 当path的长度为2n时,满足结束条件,将path加入res中
  • 基于选择列表【"(", ")"】,做选择
  • 递归调用
  • 撤销选择
const dfs = function(path) {
    if(path.length === 2*n){
    res.push(path.join(""))
    }

    path.push('(')
    dfs(path)
    path.pop()

    path.push(')')
    dfs(path)
    path.pop()
}

2、“剪枝”

基于当前的路径,如何判断当前的括号组合是否合法?
不难发现:如果当前的路径中,左括号数量小于右括号的数量,那么这一定是不合法的括号组合

如何判断当前路径已经结束?
很简单,只要看路径的长度是否为2n即可

代码实现(JavaScript)

在核心函数dfs中,我们可以用2个变量left和right,记录已经使用的左右括号数量
在做选择之前:

  • 对当前路径的合法性进行判断
  • 判断当前路径是否满足结束条件
var generateParenthesis = function(n) {
    const res = new Array()

    const dfs = function(left,right,path) {
        if(left>n || right>n) {
            return
        }
        if(left < right) {
            return
        }
        if(path.length === 2*n){
            res.push(path.join(""))
            return
        }
        
        path.push('(')
        dfs(left+1, right, path)
        path.pop()

        path.push(')')
        dfs(left, right+1,path)
        path.pop()
    }

    dfs(0,0,[])
    return res
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 解法:使用回溯控制...
    清晨我上马阅读 76评论 0 0
  • 题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n ...
    半亩房顶阅读 369评论 0 1
  • 参考:第7课-泛型递归、树的递归 LeetCode-22. 括号生成 22. 括号生成 数字 n 代表生成括号的对...
    傅晨明阅读 231评论 0 0
  • 1.题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出...
    NWPU_HaiboWu阅读 164评论 0 1
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,328评论 0 13