【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;
    }
}

小总结

由此题get到的Java语法的注意点:

  1. Java的Stack类的参数是对象类型;
  2. 对象类型的比较用equals()方法,而不是 == 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值