问题:
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
分析:
使用递归算法。保存一个soFar的string,表示目前为止已经有的括号,并记录里面有多少是左括号,有多少是右括号。那我们就在此基础上,再推进一个左括号,然后recursion;回来,取而代之地推进一个右括号,然后recursion。当然,在推进右括号的时候要判断能不能推进,也就是左括号够不够多。这样recursion的结果就是对的,因为对于soFar来说,它仅面临两个sub problem:要么下一个是左括号,要么下一个是右括号。
代码:
class Solution {
public:
void generateParenthesisHelper(vector<string> &result, string soFar, int l, int r, int n) {
if (l == n) {
soFar.append(n-r, ')');
result.push_back(soFar);
return;
}
generateParenthesisHelper(result, soFar + "(", l + 1, r, n);
if (l > r)
generateParenthesisHelper(result, soFar + ")", l, r + 1, n);
}
vector<string> generateParenthesis(int n) {
vector<string> result;
generateParenthesisHelper(result, "", 0, 0, n);
return result;
}
};