1. 程式人生 > 其它 >LeetCode22.括號生成

LeetCode22.括號生成

LeetCode22.括號生成

題目描述

/**
     * 
     * 數字 n 代表生成括號的對數,請你設計一個函式,
     * 用於能夠生成所有可能的並且 有效的 括號組合。
     * 
     */

思路分析

  1. 生成括號,可以 使用深度優先+剪枝的方式,將有效的組合儲存到集合中,將無效的組合剪枝
  2. 編寫一個深度優先的遞迴函式,實現不斷的拼接字串,即不斷的向初始的空字串拼接左括號或者右括號
  3. 函式中給定的n值即為左括號也為右括號的個數,在拼接過程中,當發現左括號個數和右括號個數都為0時,說明找到一個滿足的括號組合,將其加入集合中
  4. 因為滿足條件的字串組合中。左括號總在在右括號的前面,即剩餘的右括號的個數大於等於左括號的個數,否則說明有右括號匹配不到左括號,不滿足條件
  5. 當上述條件都不滿足時,說明括號還沒拼接成功,先向左括號遞迴,然後再向右括號遞迴
  6. 原始碼見下

原始碼及分析

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