Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 10-括号生成.mdx
目录
题目思路代码
907 字
约 3 分钟
更新于 2026/08/20

括号生成

题目

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

示例 1:

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

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

思路:

  • n 代表生成括号的对数,也就是左括号有 n 个,右括号也有 n 个。
  • 如果不考虑括号的有效性(成对),列出所有的可能,再排出掉无效的,剩下的就是有效的
    • 想象一个二叉树,根结点是空字符串,然后层级是 n
    • 没个节点的下一个节点都有左括号 和 右括号 两种可能
    • 最后便利每一条树的路径,即可得到生成的所有括号的结果集。
    • 遍历树的时候,如果右括号的数量大于左括号,则说明当前的结果不合题意,需要排除。

代码:

 const generateParenthesis = (n) => {
        if (n <= 0 ) return [];
        const result = [];
        const DFS = (str, l, r) => {
            if (l > n || r > l) return;  // 如果字符串中左括号的数量大于 n ,或者右括号的数量大于左括号,则字符串不合题意,舍去。
            if (str.length >= 2 * n) { // 如果当前字符串的长度大于 2n,则说明已经达到最长,整棵树,深度已经遍历到底。
                result.push(str);
                return;
            }
 
            DFS(`${str}(`, l + 1, r); // 遍历树左边:当前已经遍历的字符串 + ‘(’ 与此同时,l 加 1 ,表示当前字符串中有 l 个左括号
            DFS(`${str})`, l, r + 1); // 遍历树右边:当前已经遍历的字符串 + ‘)’  与此同时, r 加 1, 表示当前字符串中有 r 个右括号
        }
 
 
        DFS('', 0, 0);
 
        return result;
    }