数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
这个题有好几种做法,这里介绍两种吧 ,这个题一开始我也不会做,看的答案,现在递归还是理解的不是很透彻,我是垃圾。
1.递归:
class Solution {
void backtracking(int n, int left, int right, vector<string>& res, string str)
{
if (right > left)
return;
if (left == n && right == n)
{
res.push_back(str);
return;
}
if (left < n)
{
str = str + '(';
backtracking(n, left+1, right, res, str);
str.pop_back();
}
if (right < left)
{
str = str + ')';
backtracking(n, left, right+1, res, str);
str.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
string str;
vector<string> res;
backtracking(n,0,0,res,"");
return res;
}
};
2.动态规划
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];
}
};