【回溯】22. 括号生成 (看看方法三 按括号序列的长度递归)

题目:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例:

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

解答:

方法一:暴力法

class Solution {
    public List<String> generateParenthesis(int n) {
        char[] chs = new char[n*2];
        List<String> res = new ArrayList<>();
        generate(chs,0, res);

        return res;
    }

     public void generate(char[] chs,int cur, List<String> res){
         if(cur == chs.length){
             if(isValid(chs)){
                 res.add(new String(chs));
             }
         }
         else{
             chs[cur] = '(';
             generate(chs,cur+1,res);
             chs[cur] = ')';
             generate(chs,cur+1,res);
         }
     }

     public boolean isValid(char[] chs){
         int balance =0;
         
         for(char ch:chs){
             if(ch =='('){
                 balance++;
             }
             else{
                 balance--;
             }
             if(balance<0){
                 return false;
             }
         }

         return balance == 0;
     }
}

方法二:回溯

class Solution {
    public List<String> generateParenthesis(int n) {
        //char[] chs = new char[n*2];
        List<String> res = new ArrayList<>();
        StringBuilder str = new StringBuilder();
        generate(0,0,n,str,res);

        return res;
    }

    
     public void generate(int open,int close,int max,StringBuilder str, List<String> res){
         if(str.length() == max*2){
                 res.add(str.toString());
         }
         else{
             if(open<max){
                 str.append("(");
                 generate(open+1,close,max,str,res);
                 str.delete(str.length()-1,str.length());
             }
             if(close<open){
                 str.append(")");
                 generate(open,close+1,max,str,res);
                 str.delete(str.length()-1,str.length());
             }
         }
     }
}

方法三:

按括号序列的长度递归

posted @ 2020-10-23 22:04  3KBLACK  阅读(111)  评论(0)    收藏  举报