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:
"((()))", "(()())", "(())()", "()(())", "()()()"
像这种类似的题目,通过回溯法来构造是比较好的了。回溯的依据是当前字符是添加左括号,还是添加右括号;为了能够正确的添加左右括号,设置curLeft,curRight来分别记录此时的左、右括号数量,同时要满足curLeft >= curRight,添加右括号的时候,要注意是否满足这个条件,结束的条件,应该是不满足这个条件,或者curRight == n构造一个完毕。
class Solution {
public:
//回溯法
void generateP(int n, int curLeft, int curRight, string curStr, vector<string> &ans)
{
if(curLeft < curRight)
return;
if(curRight == n)
{
ans.push_back(curStr);
return;
}
//添加左边括号
if(curLeft < n)
{
curStr.push_back('(');
generateP(n, curLeft + 1, curRight, curStr, ans);
curStr.pop_back();
}
//添加右边括号
if(curRight < n && curRight < curLeft)
{
curStr.push_back(')');
generateP(n, curLeft, curRight + 1, curStr, ans);
curStr.pop_back();
}
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
if(n > 0)
{
string curStr = "";
generateP(n, 0, 0, curStr, ans);
}
return ans;
}
};