力扣 #22 括號生成(回溯法//深度遍歷 && 剪枝)

#22 括號生成

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

示例:

輸入:n = 3
輸出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

思路:

  • 生成括號就是典型的回溯算法。
  • 也可以叫深度遍歷。
  • 搭配合理的剪枝
  • 從空白字符串開始,遞歸地添加左括號或右括號。
  • 如果左括號的數量大於n或者數量小於右括號的數量,剪枝。

代碼:

LeetCode版代碼

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<String>();
        generate(res, "", 0, 0, n);
        return res;
    }
        //count1統計“(”的個數,count2統計“)”的個數
    public void generate(List<String> res , String ans, int leftCount, int rightCount, int n){
        //括號數量超過了n,結束遞歸。
        if(leftCount > n || rightCount > n) return;
        //如果左括號和右括號數量相等且都爲n,將這個序列添加進結果,剪枝。
        if(leftCount == n && rightCount == n) {
            res.add(ans);
            return;
        }
        /*
        如果左括號數量不小於右括號數量,也隱含了剪枝。
        其實省略了下面這行代碼
        if(leftCount < rightCOunt) return;
         */
        if(leftCount >= rightCount){
            //加一個左括號
            generate(res, ans+"(", leftCount+1, rightCount, n);
            //加一個右括號
            generate(res, ans+")", leftCount, rightCount+1, n);
        }
    }
}

idea版代碼

import java.util.ArrayList;
import java.util.List;

public class number_22 {
    public static void main(String[] args) {
        List<String> l;
        l = generateParenthesis(1);
        System.out.println(l);
    }

    public static List<String> generateParenthesis(int n){
        List<String> l = new ArrayList<>();
        generate(l,"",0,0,n);
        return l;
    }

    public static void generate(List<String> res, String ans, int leftCount, int rightCount, int n){
        //如果左側括號數量或右側括號數量大於n,剪枝
        if(leftCount>n || rightCount>n) return;
        //如果括號匹配到n個,添加到結果中,剪枝。
        if(leftCount == n && rightCount == n) {
            res.add(ans);
            return;
        }
        
        /*
        左側括號數量大於等於右側括號數量,也隱含了剪枝。
        其實省略了下面這行代碼
        if(leftCount < rightCOunt) return;
         */
        if(leftCount>=rightCount){
            generate(res,ans+"(",leftCount+1,rightCount,n);
            generate(res,ans+")",leftCount,rightCount+1,n);
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章