给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解析:分析给出的例子可以发现,有效的括号组合,从左边开始计算,左括号的数量总是大于右括号的数量,而违反这一原则的可能均不合法。
因此这一题可以用回溯法,每次尝试向现有字符串中加入左括号或右括号,如果合法则继续一上操作,直至左右括号数量均达到要求,否则如果不合法,进行回溯。
class Solution {
public:
vector<string> generateParenthesis(int n) {
fillone("",n,n);
return res;
}
private:
vector<string> res;
void fillone(string str,int l,int r){
if(l>r) return;
if(l==0&&r==0) return res.push_back(str);
if(l>0) fillone(str+'(',l-1,r);
if(r>0) fillone(str+')',l,r-1);
}
};