[42](バックトラッキング方法)ブラケット生成(LC 22)

ブラケットの生成

問題の説明

数値nは、生成ブラケットの対数を表します。可能なすべての効果的なブラケットの組み合わせを生成する関数を設計してください。

例:
ここに画像の説明を挿入

問題解決のアイデア

バックトラッキングメソッドを使用して、One_of_ans [2 * n]配列を使用して結果を格納します。One_of_ans[i]が0の場合は右括弧、One_of_ans [i]が1の場合は左括弧、トラバースです。サブセットツリーを使用して実行可能なソリューションを取得し、One_of_ans []を文字列に変換して、この質問に対する回答を取得します。

コード

class Solution {
    
    
    public List<String> generateParenthesis(int n) {
    
    
        List<String> res = new ArrayList<String>();
        int One_of_ans[] = new int[2*n];
        backtrack(res,One_of_ans,2*n,0);
        return res;
    }

    public void backtrack(List<String> res,int One_of_ans[],int n,int t){
    
    //回溯
     //   System.out.print("现在在第"+t+"层:");
        if(t>=n)
            output(res,One_of_ans,n);
        else{
    
    
            for(int i=0;i<=1;i++){
    
    
                One_of_ans[t] = i;
                backtrack(res,One_of_ans,n,t+1);
            }
        }
    }

    public void output(List<String> res,int One_of_ans[],int n){
    
     //根据整型数组得到结果
        if(legal(One_of_ans,n)){
    
    
            String OneOfAns = "";
            for(int i : One_of_ans){
    
    
                if(i == 0)
                    OneOfAns = OneOfAns +"(";
                else
                    OneOfAns = OneOfAns+ ")";
            }
            res.add(OneOfAns);
        }
    }

    public boolean legal(int One_of_ans[],int n){
    
    //判断是否为合法括号
        for(int i : One_of_ans)
            System.out.print(i);
        System.out.println();
        Stack<Integer> s = new Stack<>();
        for(int i : One_of_ans){
    
    
            if(i == 0)
                s.push(new Integer(1));
            else if(s.isEmpty() || !s.pop().equals((Integer)i))
                return false;
        }
        if(!s.isEmpty())
            return false;
        return true;
    }
}

小さな要約

この質問から得られたJava文法に関する注意:

  1. JavaのStackクラスのパラメータはオブジェクトタイプです。
  2. オブジェクトタイプの比較では、==の代わりにequals()メソッドを使用します。

おすすめ

転載: blog.csdn.net/qq_43424037/article/details/114298987