给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
方法1:深搜:
class Solution {
public:
void dfs(int n, vector<string> &re, string temp, int l, int r){
if(temp.size()==2*n){
re.push_back(temp);
return;
}
if(l<n) dfs(n, re, temp+'(', l+1, r);
if(r<l && r<n) dfs(n, re, temp+')', l, r+1);
}
vector<string> generateParenthesis(int n) {
vector<string>re;
if(n==0) return re;
dfs(n, re, "", 0, 0);
return re;
}
};
方法2:迭代
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> re={""};
for(int i=0; i<n*2; ++i){
vector<string> temp;
for(int j=0; j<re.size(); ++j){
int l=0, r=0;
for(auto x: re[j]){
if (x=='(') ++l;
if (x==')') ++r;
}
if (l<n) temp.push_back(re[j]+'(');
if (r<n && r<l) temp.push_back(re[j]+')');
}
re=temp;
}
return re;
}
};