其他分享
首页 > 其他分享> > 22. 括号生成(DFS 剪枝+回溯)

22. 括号生成(DFS 剪枝+回溯)

作者:互联网

22. 括号生成(DFS 剪枝+回溯)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

 

提示:

DFS 剪枝+回溯:

 1 class Solution {
 2 public:
 3     vector<string> ans; // 字符串所有括号可能拼接的结果
 4     void dfs(int n, int left, int right, string str) { // left:剩余左括号数,right:剩余右括号数,str:拼接的括号类型"("或者")"
 5         // 左括号数大于n时或者右括号数大于左括号数时剪枝
 6         if (left > n || right > left) {
 7             return;
 8         }
 9         // 递归出口:字符个数到达2*n时回溯
10         if (str.size() == 2 * n) {
11             ans.push_back(str);
12             return;
13         }
14         dfs(n, left + 1, right, str + "(");
15         dfs(n, left, right + 1, str + ")");
16         return;
17     }
18     vector<string> generateParenthesis(int n) {
19         if (n <= 0) {
20             return ans;
21         }
22         dfs(n, 0, 0, "");
23         return ans;
24     }
25 };

DFS 只有一个回溯出口:

 1 class Solution {
 2 public:
 3     vector<string> ans; // 字符串所有括号可能拼接的结果
 4     void dfs(int n, int left, int right, string str) { // left:剩余左括号数,right:剩余右括号数,str:拼接的括号类型"("或者")"
 5         // 递归出口:字符个数到达2*n时回溯
 6         if (str.size() == 2 * n) {
 7             ans.push_back(str);
 8             return;
 9         }
10         // 当左括号小于n时可以添加左括号
11         if (left < n) {
12             dfs(n, left + 1, right, str + "(");
13         }
14         // 当右括号数小于左括号数时可以添加右括号
15         if (right < left) {
16             dfs(n, left, right + 1, str + ")");
17         }
18         return;
19     }
20     vector<string> generateParenthesis(int n) {
21         if (n <= 0) {
22             return ans;
23         }
24         dfs(n, 0, 0, "");
25         return ans;
26     }
27 };

标签:剪枝,right,22,int,DFS,括号,dfs,str,left
来源: https://www.cnblogs.com/MGFangel/p/16295723.html