1. 程式人生 > >【LeetCode】 22 有效括號

【LeetCode】 22 有效括號

在這裡插入圖片描述


解題思路:
1 最樸素的想法是:對每種可能出現的序列情況排列組合,將最後不符合條件的情況剔除。
2 回溯法:和上方的思路差不多,但是隻要在組建字串的過程中,出現了不符合要求的情況,直接將其丟棄
3 所有序列可以被看成是一個二叉樹,根節點是空字串,左孩子加左括號,右孩子加右括號。每個結果都對應了樹裡的一個從根到節點的序列。對每個節點進行丟棄分析,需要我們把字串形成過程中每加一個左/右括號的情況都拿出來分析。綜上所述,遞迴比較符合我們的需求。

程式碼:

class Solution {
    public List<String> generateParenthesis(int n) {
        
        List<String> result = new ArrayList<>();
        
        getParentheses(result,n,"",0,0);
        
        return result;    
    }
    
    void getParentheses(List<String> result, int max, String nowStr, int haveLeft, int haveRight){
        if (haveLeft + haveRight == max*2){
            result.add(nowStr);
            return;
        }
        
        if (haveLeft < max){
            getParentheses(result, max, nowStr+"(", haveLeft+1, haveRight);
        }
        if (haveRight < haveLeft){
            getParentheses(result, max, nowStr+")", haveLeft, haveRight+1);
        }
        
    }
}