1. 程式人生 > 其它 >22. 括號生成(DFS 剪枝+回溯)

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 };