22. 括號生成(DFS 剪枝+回溯)
阿新 • • 發佈:2022-05-21
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(intn, 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 };