『LeetCode|每日一题』---->括号生成

目录

每日一句

 作者简介

『LeetCode|每日一题』括号生成

1.每日一题

2.解题思路(递归)

        2.1 思路分析

        2.1 核心代码(递归) 

        2.2 全部代码

        2.3 运行结果

 3.解题思路(回溯)

        3.1 思路分析

        3.1 核心代码(回溯) 

        3.2 全部代码

        3.3 运行结果


每日一句

人和人是不平等的,其中最重要的原因,是人与人有知识的差异。

 作者简介

👨‍🎓一位20级的计科专业的新手,请各位大佬多多指教

🏡个人主页:XiaoChen_Android

📚学习专栏:力扣专栏

🕒发布日期:2022/8/12

『LeetCode|每日一题』括号生成

1.每日一题

原文链接--->点我

2.解题思路(递归)

        2.1 思路分析

可以定义两个变量l和r代表左括号和右括号的数量,同时通过l和r实现剪枝,规则如图所示

        S1:判断递归的结束条件,很显然,当括号中左括号和右括号数量相等且都等于n时,即找到了一个有效括号;

        S2:剪枝:如上图

  • 当左括号的数量小于右括号的数量,那么括号一定无效
  • 当左括号的数量大于n时,则不符合题目要求   

        S3:递归:如果每次填的是"(",则left + 1,right不变,相反如果每次填的是")",则right + 1,left不变;

        S4:最后把拼接的字符串添加进ans即可              

        2.1 核心代码(递归) 

    //递归
    public void digui(int l , int r , String res){
        if(l == n && r == n) { //递归结束条件
            ans.add(res);
            return ;
        }

        //剪枝
        //无效的括号
        // 全部都是左括号,不能再加左括号  l肯定会比r先超过n
        if(l < r || l > n) return ;  
        
        digui(l + 1 , r , res + "(");
        digui(l , r + 1 , res + ")");

    }

        2.2 全部代码

class Solution {
    List<String> ans = new ArrayList<String>();
    int n;
    public List<String> generateParenthesis(int n) {
        this.n = n;
        digui(0 , 0 , "");
        return ans;
    }
    //递归
    public void digui(int l , int r , String res){
        if(l == n && r == n) { //递归结束条件
            ans.add(res);
            return ;
        }

        //剪枝
        //无效的括号
        // 全部都是左括号,不能再加左括号  l肯定会比r先超过n
        if(l < r || l > n) return ;  
        digui(l + 1 , r , res + "(");
        digui(l , r + 1 , res + ")");

    }
}

        2.3 运行结果

 3.解题思路(回溯)

        3.1 思路分析

思路和递归类似,不过回溯中有一步必须完成,那就是必须把前一次拼接在sb后面的字符删掉,这是回溯的标志;

退出回溯的条件和剪枝都与递归一样

        3.1 核心代码(回溯) 

    //回溯
    public void backtrack(int l , int r){
        if(l == n && r == n) { //递归结束条件
            ans.add(sb.toString());
            return ;
        }
        //剪枝
        //无效的括号
        // 全部都是左括号,不能再加左括号  l肯定会比r先超过n
        if(l < r || l > n) return ;  
        //回溯
        sb.append("(");
        backtrack(l + 1 , r);
        sb.deleteCharAt(sb.length() - 1);

        sb.append(")");
        backtrack(l , r + 1);
        sb.deleteCharAt(sb.length() - 1);

    }

        3.2 全部代码

class Solution {
    List<String> ans = new ArrayList<String>();
    int n;
    StringBuilder sb = new StringBuilder();
    public List<String> generateParenthesis(int n) {
        this.n = n;
        backtrack(0 , 0);
        return ans;
    }
    //回溯
    public void backtrack(int l , int r){
        if(l == n && r == n) { //递归结束条件
            ans.add(sb.toString());
            return ;
        }
        //剪枝
        //无效的括号
        // 全部都是左括号,不能再加左括号  l肯定会比r先超过n
        if(l < r || l > n) return ;  
        //回溯
        sb.append("(");
        backtrack(l + 1 , r);
        sb.deleteCharAt(sb.length() - 1);

        sb.append(")");
        backtrack(l , r + 1);
        sb.deleteCharAt(sb.length() - 1);

    }
}

        3.3 运行结果


🍁 类似题目推荐:

1.剑指offer专项练习

2.算法专项练习

3.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

  如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值