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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
method 1
和Permution的回溯思路大概一致,就是(和)的排列,但是有一个额外要求,要求已出现的左括号要多于右括号,否则无法匹配
void helper(int n, int left, int right, string tmp, vector<string>& ans){
if (tmp.size() == n) ans.push_back(tmp);
else
{
if (left > 0) {
tmp.append("(");
helper(n, left - 1, right, tmp, ans);
tmp.pop_back();
}
if (left < right && right > 0){
tmp.append(")");
helper(n, left, right - 1, tmp, ans);
}
}
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
if (n == 0) return ans;
string tmp = "(";
helper(2*n, n - 1, n, tmp, ans);
return ans;
}