【LeetCode递归】括号生成,使用dfs

发布时间 2023-10-12 16:37:41作者: dayceng

括号匹配

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

代码与思路

有效的括号组合要满足两个条件:

①左右括号数量相等;

②任意前缀的'('数量要大于等于')'

即不论在哪里切割这个字符串,所得的前缀串中左括号一定大于等于右括号

"((|()))"左2右0;

"((()|))"左3右1;

"((()))|"左3右3;

然后我们可以使用递归的方式去不断判断当前左右括号的个数是否达到n,以及左右括号的数量是否满足合法的两个条件

class Solution {
private:
    vector<string> res;
    void dfs(int n, int left_c, int right_c, string res_seq){
        //如果左括号数=n并且右括号数=n,那么递归停止,保存当前的res_seq
        //n表示有几对括号,比如3对的话,那么左右括号都应该有三个
        if(left_c == n && right_c == n){
            res.push_back(res_seq);
            return;
        }//有效的括号组合要满足两个条件:①左右括号数量相等;②任意前缀的'('数量要大于等于')'
        if(left_c < n) dfs(n, left_c + 1, right_c, res_seq + "(");//如果当前左括号还不够,增加左括号
        //如果当前右括号还不够并且当前仍满足左括号数量大于等于右括号的条件(合法条件),增加右括号
        if(right_c < n && left_c > right_c) dfs(n, left_c, right_c + 1, res_seq + ")");
        return;
    }
public:
    vector<string> generateParenthesis(int n) {
        dfs(n, 0, 0, "");
        return res;
    }
};