给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
方法一:暴力法
vector<string> res;
int n;
vector<string> generateParenthesis(){
generate("", 0, 0);
return res;
}
// cnt1 是'('的数量,cnt2是')'的数量
void generate(string ans, int cnt1, int cnt2){
if(cnt1 > n || cnt2 > n) return;
if(cnt1 == n && cnt2 == n) res.push_back(ans);
if(cnt1 < cnt2) return;
generate(ans+'(', cnt1+1, cnt2);
generate(ans+')', cnt1, cnt2+1);
}
方法二:回溯法(剪枝)
vector<string> res;
int n;
vector<string> generateParenthesis(){
generate("", 0, 0);
return res;
}
void generate(string ans, cnt1, cnt2){
if(cnt1 == n && cnt1 == n) res.push_back(ans);
if(cnt1 < n) generate(ans+'(', cnt1+1, cnt2);
if(cnt2 < cnt1) generate(ans+')', cnt1, cnt2+1);
}