算法_生成括号

该文章介绍了如何通过深度优先搜索(DFS)和回溯思想解决生成给定对数n的括号组合问题,包括剪枝策略以避免无效组合,并提供了一个名为`bracket`的函数实现。
摘要由CSDN通过智能技术生成
题目描述:
数字 n 代表⽣成括号的对数,请你设计⼀个函数,⽤于能够⽣成所有可能的并且 有效的 括号组合。
示例:
输⼊: n = 3
输出: [
                "((()))",
                "(()())",
                "(())()",
                "()(())",
                "()()()"
            ]

本题采用:

  • 深度优先搜索DFS(回溯思想):一路走到黑,然后回退,继续走到黑
  • 剪枝策略:
    • 生成括号失败
      • 左括号数小于右括号数;
      • 左括号数 / 右括号数大于括号对数n
    • 生成括号成功——左括号数=右括号数=括号对数n

 

function bracket(n) {
        const res = [];
        function dfs(l, r, str) {
          // l,r分别表示左右括号数
          // 剪枝
          if (l > n || r > n || l < r) return;
          // 生成成功,返回
          if (l === r && l === n) {
            res.push(str);
            return;
          }
          // 加一个左括号
          dfs(l + 1, r, str + "(");
          // 加一个右括号
          dfs(l, r + 1, str + ")");
        }
        dfs(0, 0, "");
        return res;
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值