【LeetCode】 22 有效括号

在这里插入图片描述


解题思路:
1 最朴素的想法是:对每种可能出现的序列情况排列组合,将最后不符合条件的情况剔除。
2 回溯法:和上方的思路差不多,但是只要在组建字符串的过程中,出现了不符合要求的情况,直接将其丢弃
3 所有序列可以被看成是一个二叉树,根节点是空字符串,左孩子加左括号,右孩子加右括号。每个结果都对应了树里的一个从根到节点的序列。对每个节点进行丢弃分析,需要我们把字符串形成过程中每加一个左/右括号的情况都拿出来分析。综上所述,递归比较符合我们的需求。

代码:

class Solution {
    public List<String> generateParenthesis(int n) {
        
        List<String> result = new ArrayList<>();
        
        getParentheses(result,n,"",0,0);
        
        return result;    
    }
    
    void getParentheses(List<String> result, int max, String nowStr, int haveLeft, int haveRight){
        if (haveLeft + haveRight == max*2){
            result.add(nowStr);
            return;
        }
        
        if (haveLeft < max){
            getParentheses(result, max, nowStr+"(", haveLeft+1, haveRight);
        }
        if (haveRight < haveLeft){
            getParentheses(result, max, nowStr+")", haveLeft, haveRight+1);
        }
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值