22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
思路一:回溯
class Solution {
public:
vector<string> generateParenthesis(int n) {
std::vector<std::string> res{};
std::string tmp{};
AddParenthesis(res, tmp, n, n);
return res;
}
void AddParenthesis(std::vector<std::string>& res, std::string& tmp, int l, int r) {
if (l > r || l < 0) return;
if (l == 0 && r == 0) {
res.push_back(tmp);
return;
}
tmp += '(';
AddParenthesis(res, tmp, l-1, r);
tmp.pop_back();
tmp += ')';
AddParenthesis(res, tmp, l, r-1);
tmp.pop_back();
}
};
思路二:动态规划
- 当我们要给出n个括号对组成的结果集 f(n)时,在这个结果中,所有字符串的第一个元素必然是 "("
- 那么必然有另一个与之匹配的右括号 ")"
- 那么还有 n-1 个括号对需要安放
- 这 n-1 个括号对中,可以有 j 个括号对位于上述这对括号的内部,那么剩余的 n-1-j 个括号对都在上述括号对右侧
- j的取值范围应该是 [0, n-1]
- 所以在计算f(n)时, 我们是需要知道 f(0), f(1), ... f(n-1)的结果的,因此需要用map保存dp过程中的每一个结果
class Solution {
public:
vector<string> generateParenthesis(int n) {
if (n == 0) return {};
if (n == 1) return { "()" };
vector<vector<string>> dp(n+1);
dp[0] = { "" };
dp[1] = { "()" };
for (int i = 2; i <= n; i++) {
for (int j = 0; j <i; j++) {
for (string p : dp[j])
for (string q : dp[i - j - 1]) {
string str = "(" + p + ")" + q;
dp[i].push_back(str);
}
}
}
return dp[n];
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理