生成合法的括号

本文介绍了如何使用Java编程实现生成给定数字n的2n个括号的合法序列,包括暴力法的递归算法和利用回溯剪枝优化的解决方案。两种方法对比,展示了在解决此类问题时的算法策略和性能优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个数字n,生成包含2n括号的合法序列

n=3
[((())), (()()), (())(), ()(()), ()()()]

暴力法

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

private void generateAll(char[] chars, List<String> res,int pos) {
        if (pos==chars.length){
            if (isVaild(chars)){
                res.add(new String(chars));
            }
            return;
        }
        chars[pos]='(';
        generateAll(chars,res,pos+1);
        chars[pos]=')';
        generateAll(chars,res,pos+1);
    }

 //判断括号是否合法
    private boolean isVaild(char[] chars) {
        int balance=0;
        for (char value : chars) {
            if (value=='(') {
                balance++;
            }else {
                balance--;
            }
            if (balance<0) return false;
        }
        return balance==0;
    }

回溯剪枝

 /**
     * 如果左括号数量不大于 nn,我们可以放一个左括号。
     * 如果右括号数量小于左括号的数量,我们可以放一个右括号。
     * 剪枝操作
     */
    public List<String> generateParenthesis2(int n){
         List<String> res=new ArrayList<>();
          backTrack(res,new StringBuilder(),0,0,n);
         return res;
    }

    private void backTrack(List<String> res, StringBuilder stringBuilder, int open, int close, int max) {
          if (stringBuilder.length()==max*2){
              res.add(stringBuilder.toString());
              return;
          }
          if (open<max){
              stringBuilder.append("(");
              backTrack(res,stringBuilder,open+1,close,max);
              stringBuilder.deleteCharAt(stringBuilder.length()-1);
          }
          if (close<open){
              stringBuilder.append(")");
              backTrack(res,stringBuilder,open,close+1,max);
              stringBuilder.deleteCharAt(stringBuilder.length()-1);
          }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值