数字
n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:
输入:n = 1 输出:["()"]提示:
1 <= n <= 8
先写一下dfs版本的代码。
void dfs(int n, int cur_l, int cur_r, vector<string>& res, string& cur_res){
if(cur_r > cur_l) return;
if(cur_r > n || cur_l > n) return;
if(cur_l == n && cur_r == n) {
res.push_back(cur_res);
return ;
}
cur_res.push_back('(');
dfs(n, cur_l + 1, cur_r, res, cur_res);
cur_res.pop_back();
cur_res.push_back(')');
dfs(n, cur_l, cur_r + 1, res, cur_res);
cur_res.pop_back();
}
vector<string> generateParenthesis(int n) {
vector<string> res;
string temp;
dfs(n, 0, 0, res, temp);
return res;
}
再补充一下动态规划版本,0ms击败100%,思路是lc官方题解看到的。
主要是这行代码 cur = '(' + in + ')' + out ,当前n个括号的情况包括,第n个括号in个括号在内部,out个在外部,其中in+out = n-1;
vector<string> generateParenthesis(int n) {
vector<vector<string>> res;
for (int i = 0; i <= n; i++) {
vector<string> cur_res;
if (i == 0) {
res.push_back(cur_res);
continue;
}
for (int j = 0; j < i; j++) {
for (int k1 = 0; k1 < res[j].size() || k1 == 0 && res[j].size() == 0; k1++) {
for (int k2 = 0; k2 < res[i - 1 - j].size() || k2 == 0 && res[i - 1 - j].size() == 0; k2++) {
string cur, in, out;
if (res[j].size() != 0) in = res[j][k1];
if (res[i - 1 - j].size() != 0) out = res[i - 1 - j][k2];
cur = '(' + in + ')' + out;
cur_res.push_back(cur);
}
}
}
res.push_back(cur_res);
}
return res[n];
}