【LeetCode】 57 括號生成

題目:

image-20200714235408159

image-20200714235359185

解題思路:

image-20200714235307974

image-20200714235323972

https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/java

代碼:

import java.util.ArrayList;
import java.util.List;

public class Solution {

    // 作減法

    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        // 特判
        if (n == 0) {
            return res;
        }

        // 執行深度優先遍歷,搜索可能的結果
        dfs("", n, n, res);
        return res;
    }

    /**
     * [@param](https://my.oschina.net/u/2303379) curStr 當前遞歸獲得的結果
     * [@param](https://my.oschina.net/u/2303379) left   左括號還有幾個可使用
     * [@param](https://my.oschina.net/u/2303379) right  右括號還有幾個可使用
     * [@param](https://my.oschina.net/u/2303379) res    結果集
     */
    private void dfs(String curStr, int left, int right, List<String> res) {
        // 由於每一次嘗試,都使用新的字符串變量,因此無需回溯
        // 在遞歸終止的時候,直接把它添加到結果集便可,注意與「力扣」第 46 題、第 39 題區分
        if (left == 0 && right == 0) {
            res.add(curStr);
            return;
        }

        // 剪枝(如圖,左括號可使用的個數嚴格大於右括號可使用的個數,才剪枝,注意這個細節)
        if (left > right) {
            return;
        }

        if (left > 0) {
            dfs(curStr + "(", left - 1, right, res);
        }

        if (right > 0) {
            dfs(curStr + ")", left, right - 1, res);
        }
    }
}
相關文章
相關標籤/搜索