这个题目是看别的小伙伴写的,在此作个笔记 . . .
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
DFS 求解
class Solution {
public:
vector<string> retArr;
vector<string> generateParenthesis(int n) {
if (n == 0) return retArr;
dfs("", 0, 0, n);
return retArr;
}
private:
void dfs(string str, int left, int right, int n) {
if (left == n && right == n) {
retArr.push_back(str);
return;
}
if (right > left) return;
if (left < n) {
dfs(str + "(", left + 1, right, n);
}
if (right < n) {
dfs(str + ")", left, right + 1, n);
}
}
};
动态规划
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<vector<string>> dp(n + 1);
dp[0].push_back(""); // 初始化
// 转移方程
//dp[i] = "(" + dp[j] + ")" + dp[i - j - 1]
// 获取第 i 对括号的所有情况
for (size_t i = 1; i <= n; i++)
{
// 第 i 对括号是 基于 i - 1 对括号获取的
for (size_t j = 0; j < i; j++)
{
// 获取第 j 对括号的所有情况
for (string& str1 : dp[j])
{
// 尾巴部分
for (string& str2 : dp[i - j - 1])
{
dp[i].push_back("(" + str1 + ")" + str2);
}
}
}
}
return dp[n];
}
};