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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
给定一个数字,输出所有左右括号正常封闭的字符串。对于这种求符合条件解的问题,回溯法一般是通用的解法。回溯法在实现的时候一般需要使用递归,其关键是递归的返回条件和递归的关系。对于本题,给定数目n后,我们可以有n个左括号和n个右括号可以拿来使用。我们设定递归规则如下:
1、返回条件:左右括号都用完时;
2、递归条件1:当左括号还有剩余时,往临时解中添加一个左括号,继续递归;
3、递归条件2:当右括号还有剩余时且右括号的数目大于左括号的数目,进行递归;
由此,我们可以得到以下代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ret;
backTrack(ret, "", n, n);
return ret;
}
void backTrack(vector<string> &ret, string tmp, int left, int right)
{
if(left == 0 && right == 0)
{
ret.push_back(tmp);
return;
}
if(left > 0)
{
backTrack(ret, tmp + '(', left - 1, right);
}
if(right > 0 && right > left)
{
backTrack(ret, tmp + ')', left, right - 1);
}
}
};