🧩Algo 回溯

22. 括号生成

难度:🟡 Medium | 标签:回溯 | 状态:⬜ LeetCode 链接

思路

DFS 维护当前左右括号数:

  • 左 < n:可加左
  • 右 < 左:可加右

到达 2n 长度收集。

代码

class Solution {
    vector<string> res;
    string path;
    int n_;
    void dfs(int open, int close) {
        if ((int)path.size() == 2 * n_) { res.push_back(path); return; }
        if (open < n_) {
            path.push_back('(');
            dfs(open + 1, close);
            path.pop_back();
        }
        if (close < open) {
            path.push_back(')');
            dfs(open, close + 1);
            path.pop_back();
        }
    }
public:
    vector<string> generateParenthesis(int n) {
        n_ = n;
        dfs(0, 0);
        return res;
    }
};

复杂度

  • 时间 O(卡特兰数 C(n))
  • 空间 O(n)

易错 / 回顾

  • 「右 < 左」保证合法性——任何前缀左括号数都 ≥ 右括号数
  • 不要尝试列所有 2² 组合再筛——大量无效路径
Related · 回溯