【递归穷举】括号生成

22. 括号生成

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

示例 1:

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

示例 2:

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


提示:

1 <= n <= 8


解题思路:

首先先不看边缘条件,如何做到穷举所有的情况——在放下第一个括号的时候,它的下一个可能是左括号,也可能是右括号,下下一个括号可能是左括号也可能是右括号……

于是整体的思路就出来了,用递归给每一层函数里都执行执行两次本函数,第一次传递左括号,第二次传递右括号。

边缘条件:通过分析可以看出左括号只要还有剩余,就可以添加,右括号只能剩余数量大于左括号剩余数量时才可以添加。于是原来设计的每一层函数都执行两次本函数变为有条件的执行,即,当左括号剩余不为0时,传递左括号;当右括号剩余大于左括号时,传递右括号。当左括号剩余等于右括号剩余等于0时,将结果保存;


class Solution {

public:

    void func(string str,int n1,int n2,vector &res){

        if (n2==0) res.push_back(str);

        else{

            if (n1!=0){

                string t1=str+"(";

                func(t1,n1-1,n2,res);

            }

            if (n2>n1){

                string t2=str+")";

                func(t2,n1,n2-1,res);

            }

        }

    }

    vector generateParenthesis(int n) {

        vector res;

        func("(",n-1,n,res);

        return res;

    }

};

你可能感兴趣的:(【递归穷举】括号生成)