标签:剪枝 right 22 int DFS 括号 dfs str left
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 };
标签:剪枝,right,22,int,DFS,括号,dfs,str,left 来源: https://www.cnblogs.com/MGFangel/p/16295723.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。