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

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 8

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 };
复制代码
posted @   跳动的休止符  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示