力扣 题目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 }
View Code

代码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 }
View Code

 

posted @ 2022-04-10 16:15  无聊的阿库娅  阅读(31)  评论(0编辑  收藏  举报