(java)leetcode 22.括号生成

在这里插入图片描述

题目解读:一个经典的回溯题,一说到回溯,就容易让人想起dfs,一说起dfs就让人想起暴力递归。而这道题,便是可以以安插“(”与“)”的位置为递归的路径去解题。

题目思路:此题目我们的最终目的就是列出所有成对的括号,不同的排列形式,给出的n,就可以理解为是n个左括号+n个右括号的不同组合形式。

既然说是不同的组合,那我们自然就可以联想到第46题 全排列。里面也是排列组合,采用的就是dfs解出的,通过递归,得出不同的排列方案。

而我们这个题还多加了限制条件,所以就应该在原有的基础上进行剪枝。将不合法的排列方法删去。

有这样几个限制条件:

  1. count(左括号)==count(右括号)==n
  2. 我们期望的括号对数==n

解题逻辑

既然确定了dfs+剪枝,那我们便可以开始写代码了。

在递归的过程中,可以使用以下思路去写:

  1. 递归的终止条件为:count()+count()==2n,list.size()==2n,在未满足条件的时候,需要一直递归,当满足条件的时候,我们就进入判断,判断括号成对的对数,如果满足条件既可以添加。如果不满足,就回退到上一步append括号前。
  2. 而回退的具体操作就是靠return,你可以将dfs设计成一个void类型,通过return;,回退到上一步的选择,比如说我们的上一步选择是append("(");然后不成功,那我们回退之后,肯定是append(")"),如果成功就list.add(),不成功就继续return到再上一步。
  3. 我们可以用一个空list存储合法的排列方式,用2n当做递归的限制条件,用括号的对数当做我们的期望。
  4. 但是我们也知道,不代表3个左括号,3个右括号就一定是3对,所以我们需要在这个地方再考虑,如何去判断括号的对数。
  5. 在判断的时候,我们可以默认成《抵消》,当空list的时候,我们默认成对的括号为0,当出现了(,说明可能会产生一个新的(),我们可以让对数+1,当出现了),我们可以认为是抵消了,再去-1。
class Solution {
    public List<String> generateParenthesis(int n) {
        
        List<String> list = new ArrayList<>();
        
        if(n==0) return new ArrayList<>();
        //通过回溯产生的list,我们想要的list,list该有的长度,期望括号的对数
        dfs("",list,n*2,0);
        return list;
        
    }
    
    //
    public void dfs(String s,List<String> list,int n,int num){
        if(s.length()==n&&num==0){
            list.add(s);
            return;
        }
        if(num<0||s.length()==n&&num!=0){
            return;
        }
        int left = num+1;
        int right = num-1;
        dfs(s+"(",list,n,left);
        dfs(s+")",list,n,right);
    }
    
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值