给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
? https://leetcode-cn.com/problems/generate-parentheses
在括号的生成中,左括号并不会构成错误,错误是由右括号的数量多于左括号所引起的。
从序列开头到任意一点中的生成序列中:右括号数量最多可以等于左括号数量,但是绝对不能多余左括号,否则就是错的括号生成.
也就是如果想加右括号,必须保证从序列开头到目前为止,左括号数量是多于右括号数量的。
class Solution {
public:
void dfs(vector<string>& res,string ans,int left,int right, int n){
if (left == right && left == n){
res.push_back(ans);
return;
}
// 下面的两个if语句是可以互换位置的,因为第一个位置不能是右括号,否则就出错了.
if (left < n){ // 不能出现右括号在最前面的情况,类似这种")(",先加左括号然后一点点的回溯.
dfs(res,ans + "(", left + 1,right,n);
}
if (left > right && right < n){ // 从序列开头到任意一点中的生成序列中:右括号最多可以等于左括号数量,但是绝对不能多余左括号,否则就是错的括号生成.也就是如果想加右括号,必须保证从序列开头到目前为止,左括号数量多余右括号数量。
dfs(res,ans + ")", left,right + 1,n);
}
}
vector<string> generateParenthesis(int n) {
string ans;
vector<string> res;
dfs(res,ans,0,0,n);
return res;
}
};