力扣 题目22-- 括号生成
题目
题解
1.递归/深度优先搜索/二叉树(思路来自 力扣评论区 ChengMing 老哥)
二叉树利用左括号和右括号数量进行递归 然后用一些条件剪枝
还是详细说明一下吧
1.设 n=2 然后画出二叉树(省略了一部分 n=2即有4个字符 所以有5层)
2.由于二叉树是从左开始走所以(反正右面也走不了 第一个不可能是右括号)
3.走到这里不对劲了 左括号明明只有两个现在却走了三个 所以我们要剪枝 回到上一次的节点
左边走不通了 那就右边吧
同理这时左边还是不能走 所以继续右边
这样一个答案就出来了 即(())
此时到最底层了 那么我们需要一步一步向上回溯
走到这个位置 我们发现右边可以走 于是我们继续走右边 之后的步骤就是与上面的一样了
2.动态规划
我们应该每一次将(和)插入到原来的string中 所以我们可以进行分割即
"(" + 【i=p时所有括号的排列组合】 + ")" + 【i=q时所有括号的排列组合】
就能使用动态规划了
代码
代码1 递归
1 #include <vector> 2 #include <string> 3 #include<iostream> 4 using namespace std; 5 void func(vector<string> &result,string str,int left,int right,int n){ 6 if (left > n || right > n || right > left) return; 7 if (left == n && right == n) { 8 result.push_back(str); return; 9 } 10 func(result, str + '(', left + 1, right, n); 11 func(result, str + ')', left, right + 1, n); 12 } 13 class Solution { 14 public: 15 vector<string> generateParenthesis(int n) { 16 vector<string> result; 17 func(result, "", 0, 0, n); 18 return result; 19 } 20 }; 21 22 int main() { 23 Solution sol; 24 sol.generateParenthesis(3); 25 26 }
代码2 动态规划
1 #include <vector> 2 #include <string> 3 #include<iostream> 4 using namespace std; 5 6 class Solution { 7 public: 8 vector<string> generateParenthesis(int n) { 9 if (n == 0) return {}; 10 if (n == 1) return { "()" }; 11 vector<vector<string>> result(n+1); 12 result[0] = { "" }; 13 result[1] = { "()" }; 14 for (int i = 2; i < n+1; i++) { 15 for (int j = 0; j < i; j++) { 16 for (int g = 0; g < result[j].size(); g++) { 17 for (int s = 0; s < result[i - j - 1].size(); s++) { 18 result[i].push_back("(" + result[j][g] + ")" + result[i - j - 1][s]); 19 } 20 } 21 } 22 } 23 return result[n]; 24 } 25 }; 26 27 int main() { 28 Solution sol; 29 sol.generateParenthesis(3); 30 31 }