[LeetCode] 22. 括号生成

参考DFS和BFS

方法一:DFS

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

        dfs("", 0, 0, n, res);
        return res;
    }

    public void dfs(String curStr,int left,int right,int n,List<String> res){
        if(left==n&&right==n){
            res.add(curStr);
            return;
        }
        if(left<right){
            return;
        }
        if(left<n){
            dfs(curStr+"(",left+1,right,n,res);
        }
        if(right<n){
            dfs(curStr+")",left,right+1,n,res);
        }
    }
}

方法二:BFS

方法三:动态规划:

无后效性可以改为动态规划

class Solution {
    public List<String> generateParenthesis(int n) {
        if(n==0){
            return new ArrayList<>();
        }

        List<List<String>> dp=new ArrayList<>(n);
        List<String> dp0=new ArrayList<>();
        dp0.add("");
        dp.add(dp0);

        for(int i=1;i<=n;i++){
            List<String> cur=new ArrayList<>();
            for(int j=0;j<i;j++){
                List<String> str1=dp.get(j);
                List<String> str2=dp.get(i-1-j);
                for(String s1:str1){
                    for(String s2:str2){
                        cur.add("("+s1+")"+s2);
                    }
                }
            }
            dp.add(cur);
        }
        return dp.get(n);
    }
}

 

posted @ 2020-04-09 14:57  doyi  阅读(122)  评论(0编辑  收藏  举报