LeetCode22.括號生成
阿新 • • 發佈:2021-06-24
LeetCode22.括號生成
題目描述
/**
*
* 數字 n 代表生成括號的對數,請你設計一個函式,
* 用於能夠生成所有可能的並且 有效的 括號組合。
*
*/
思路分析
- 生成括號,可以 使用深度優先+剪枝的方式,將有效的組合儲存到集合中,將無效的組合剪枝
- 編寫一個深度優先的遞迴函式,實現不斷的拼接字串,即不斷的向初始的空字串拼接左括號或者右括號
- 函式中給定的n值即為左括號也為右括號的個數,在拼接過程中,當發現左括號個數和右括號個數都為0時,說明找到一個滿足的括號組合,將其加入集合中
- 因為滿足條件的字串組合中。左括號總在在右括號的前面,即剩餘的右括號的個數大於等於左括號的個數,否則說明有右括號匹配不到左括號,不滿足條件
- 當上述條件都不滿足時,說明括號還沒拼接成功,先向左括號遞迴,然後再向右括號遞迴
- 原始碼見下
原始碼及分析
public List<String> generateParenthesis(int n) { String cur = ""; List<String> list = new ArrayList<>(); dfs(cur, n, n, list); return list; } /** * 深度優先 * * @param cur 當前遞迴得到的結果 * @param left 左括號還有幾個 * @param right 右括號還有幾個 * @param res 結果 */ public void dfs(String cur, int left, int right, List<String> res) { //如果遞迴到左右括號都使用完並且滿足條件則新增到結果集 if (left == 0 && right == 0) { res.add(cur); return; } //剪枝,因為有效的括號總是先左側再右側,因此剩餘的括號中左側總是小於等於右側, // 一旦出現右側括號小於左側括號數的情況,說明這種情況無效 if (left > right) { return; } //先遞迴左括號 if (left > 0) { dfs(cur + "(", left - 1, right, res); } //再遞迴右括號 if (right > 0) { dfs(cur + ")", left, right - 1, res); } }