1. 程式人生 > 實用技巧 >攻防世界-高手進階區通關筆記

攻防世界-高手進階區通關筆記

括號生成

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

示例:

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

解題思路:用回溯解決,不好想到的是方法中傳入左括號和右括號剩下的數量

class Solution {
    private List<String> ans = new ArrayList();
    public List<String> generateParenthesis(int n) {
        dfs(n, new StringBuffer(), n, n);
        return ans;
    }
    
    private void dfs(int n, StringBuffer sb, int left, int right) {
        
        //剩下的右括號數量小於左括號數量那麼一定不合法
        if(left > right)
            return ;
        
        if(left < 0 || right < 0)
            return ;
        
        if(left == 0 && right == 0) {
            ans.add(sb.toString());
            return ;
        }
        
        //先嚐試左括號
        sb.append("(");
        dfs(n, sb, left - 1, right);
        sb.deleteCharAt(sb.length() - 1);
        
        //嘗試右括號
        sb.append(")");
        dfs(n, sb, left, right - 1);
        sb.deleteCharAt(sb.length() - 1);
        
    }
    
}