描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
分析:
回溯法
递归
每次填入的要么是(要么是),当然,第一个肯定是(,并且)的数目不会超过(;记录左括号和右括号的数量,当分别达到n时即为合格的状态,可以压入vector,当然为了去重最好先用set然后转为vector
代码:
在递归时传入的参数非常重要,发现left+=1和left+1这样的传入得到的结果是不一样的
class Solution {
public:
vector<string> ans;
set<string>setans;
void backWay(string cur, int left, int right, int n)
{
if (left ==n&& right ==n)
{
setans.insert(cur);
return; }
if (left < n)
{
backWay( cur+"(", left+1 , right, n);
}
if(right < left)
{
//cur = cur + ")";
//right += 1;
backWay( cur+")", left, right+1, n);
}
}
vector<string> generateParenthesis(int n) {
setans.clear();
ans.clear();
backWay("", 0, 0, n);
set<string>::iterator it;
for (it = setans.begin(); it != setans.end(); it++)
{
ans.push_back(*it);
}
return ans;
}
};