Leetcode 22. Generate Parentheses

题目描述:给定一个数字n生成长度为n的合法的括号字符串。

题目链接:Leetcode 22. Generate Parentheses

这个题目一看用递归,但是怎么剪枝呢?就是的关系,右括号一定不能大于左括号数,最终两个数一定相等,左右括号数各为一半,因为只有一种括号,所以不用考虑([)]这种情况。

代码如下

class Solution {
     public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();

        dfs(ans, "(", n * 2, 1, 0);
        return ans;
    }

    public void dfs(List<String> ans, String sb, int n, int nl, int nr) {
        if (sb.length() > n) return;
        if (sb.length() == n) {
            ans.add(sb);
        }
        if (nr - nl > 0) {
            return;
        }
        if (nl < n / 2) {

            dfs(ans, sb + "(", n, nl + 1, nr);

        }
        if (nr < n / 2) {

            dfs(ans, sb + ")", n, nl, nr + 1);

        }
        
    }
}
    
## 改进版记录左括号数 右括号数
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        ans = []
        self.dfs(ans,"(",2*n,1,0)
        return ans        
    def dfs(self,ans,curr_s,l,nl,nr):
        if len(curr_s) > l:
            return
        if len(curr_s) == l:
            ans.append(curr_s)
            return 
        
        if nr - nl > 0:
            return 
        if nl< (l // 2):
            self.dfs(ans,curr_s + "(",l,nl+1,nr)
        if nr < (l // 2):
            self.dfs(ans,curr_s + ")",l,nl,nr+1)
    
        

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值