2020.12.9每日複習

weixin_44460781發表於2020-12-10

22.括號生成

在這裡插入圖片描述
分析

  • 當前左右括號都有大於 0 個可以使用的時候,才產生分支;
  • 產生左分支的時候,只看當前是否還有左括號可以使用;
  • 產生右分支的時候,還受到左分支的限制,右邊剩餘可以使用的括號數量一定得在嚴格大於左邊剩餘的數量的時候,才可以產生分支;
  • 在左邊和右邊剩餘的括號數都等於 0 的時候結算。
class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        if(n == 0) return res;
        dfs("", n, n, res);
        return res;
    }
    //left表示左括號還剩幾個,right表示右括號還剩幾個,str表示拼接的括號字串
    public void dfs(String str, int left, int right, List<String> res) {
        if(left == 0 && right == 0) {  //如果左右同時為0,則全部遍歷完成
            res.add(str);
            return;
        }
        if(left > right) { //如果左括號剩下的比右括號多,則不可能是有效的括號組合
            return;
        }
        if(left > 0) {
            dfs(str + "(", left - 1, right, res);
        }
        if(right > 0) {
            dfs(str + ")", left, right - 1, res);
        }
    }
}