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 };
标签:剪枝,right,22,int,DFS,括号,dfs,str,left 来源: https://www.cnblogs.com/MGFangel/p/16295723.html