1. 程式人生 > 其它 >力扣top100-22. 括號生成-回溯

力扣top100-22. 括號生成-回溯

題目

連結:https://leetcode-cn.com/problems/generate-parentheses
數字 n代表生成括號的對數,請你設計一個函式,用於能夠生成所有可能的並且 有效的 括號組合。
示例 1:
輸入:n = 3
輸出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
輸入:n = 1
輸出:["()"]

演算法選擇

和電話號盤的題很像,都是直接考慮用遞迴插入左右括號就行了
只不過棧空間(StringBuilder)裡有些值不插入,直接返回(回溯)

思路

設定倆計數器,左右括號的個數
左括號不超過n就可以遞迴加入左括號
右括號不超過左括號,就遞迴插入右括號
每次遞迴完成不要忘記彈出插入的括號

程式碼

class Solution {
  public static List<String> generateParenthesis(int n) {
        List<String>res =new ArrayList<>();
        StringBuilder sb=new StringBuilder();
        int leftCount=0,rightCount=0;//記錄左括號-有括號的個數
        insertParent(res,sb,leftCount,rightCount,n,0);
        return res;

    }
    pulibc static void insertParent(List<String> res, StringBuilder sb, int leftCount, int rightCount, int n, int i) {
        if(i==2*n){
            //所有括號都添加了
            res.add(sb.toString());
            return;
        }
        //插入第i個左括號
        if(leftCount<n){
            sb.append("(");
            insertParent(res,sb, leftCount+1, rightCount,n,i+1);
            sb.deleteCharAt(i);
        }


        //插入右括號之前要判斷
        if(rightCount<leftCount) {
            sb.append(")");
            insertParent(res, sb, leftCount, rightCount + 1, n, i + 1);
            sb.deleteCharAt(i);
        }
    }
}

本文來自部落格園,作者:熒惑微光,轉載請註明原文連結:https://www.cnblogs.com/yinghuoweiguang/p/15962269.html