LeetCode 22 :Generate Parentheses

37 篇文章 0 订阅
26 篇文章 0 订阅

作为经典的回溯问题,这道题对于理解回溯的基本框架帮助还是挺大的。

所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集

所以在思考问题的时候,首先需要考虑:
1. 边界条件(任何算法都需要考虑这个,往往输入并不如你所想那么理想)
2. 满足解的条件(当满足解,则添加进解集,这有点像并查集,当然有的只需要返回一个解即可)
3. 否则继续寻找

对于这道题,在任何时刻,你都有两种选择:左括号或者有括号,同时也有边界条件
当左括号的数量大于右括号的数量时,则返回,即不可能存在解。
同时,当满足左右两边括号用完之后,即满足条件的解,此时加入到解集当中,否则继续寻找

public class Solution {
    public List<String> ans = new ArrayList<>();
    public void robot(int left , int right,String str ){
        //不可能存在合理的解 返回 不继续搜索
        if(left>right) return;
        //满足条件的解
        if(left==0 && right==0){
            ans.add(str);
            return;
        }else{
                //枚举不同的可能性
               if(left>0){
                robot(left-1,right,str+"(");
               }
               if(right>0){
                robot(left,right-1,str+")");
               }
        }
    }
    public List<String> generateParenthesis(int n) {
        robot(n,n,"");
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值