LeetCode - 22. 括號的生成(遞迴)1

yours_棒棒糖發表於2020-10-27
  1. 括號生成

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

示例:

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

方法一: 遞迴

先考慮自頂向下的邏輯思考,進行程式碼的編寫。

思路:

不考慮括號產生的合法性,括號放置位置可為2 * n 個,即可放左括號,也可放右括號;
之後再祛除不合法的括號(思考判斷條件是左括號只要不超過n,則隨時可以加;右括號在左個數 > 右個數 就新增)

class Solution {
    private List<String> result;
    public List<String> generateParenthesis(int n) {
        result = new ArrayList<String>();
        _generate(0, 0, n,"");
        return result;
    }

    //如果s不合法就退出
    // left 隨時加,只要不超標
    // right 左個數>右個數 就新增
    private void _generate(int left, int right, int n, String s) {
        //terminator
        if (left == n && right == n){
            result.add(s);
            return;
        }
        //process current logic :left ,right

        //drill down
        //左括號增加的條件
        if (left < n)
            _generate(left + 1,right,n,s+"(");
        //右括號增加的條件
        if (left > right)
            _generate(left,right + 1 ,n,s+")");

        //reverse status
    }


}

相關文章