题目
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);
}
};