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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!