力扣top100-22. 括號生成-回溯
阿新 • • 發佈:2022-03-03
題目
連結: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