题目

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思路

本题是典型的卡特兰数的应用,与之类似的还有出栈次序,详情请戳卡特兰数
本题具体的解题思路,是这样的,要求括号的组合数,那么就要找到卡特兰数的性质,总结如下,对于2n(此题测试n=3)个括号,在某个时间点,必定是左括号书大于右括号数,而且初始括号必定是左括号。那么用递归的思想来求解。递归的临界条件是:左括号剩余数与右括号剩余数同时为0。

代码

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        string str = "(";
        vector<string> res;
        generate_parentheses(n-1,n,str,res);
        return res;

    }
    void generate_parentheses(int left,int right,string s,vector<string>& res){
        if(left==0&&right==0)
            res.push_back(s);
        if(left>0)
            generate_parentheses(left-1,right,s+'(',res);
        if(right>0&&right>left)
            generate_parentheses(left,right-1,s+')',res);
    }
};