22.括号生成

在这里插入图片描述

这个题我想起了Catalan数,但是这个直接给出的是有效组合的数目。这个笔记是看的B站韩老师的视频【数学思维与文化漫谈】卡塔兰数——组合数学的重要内容&中小学数学竞赛的重要考点
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
但是代码就不知道怎么体现这个过程。


参考这个链接LeetCode 刷题笔记——递归与回溯的理解写的python代码。
在这里插入图片描述

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:

        def backtrack(cur:str, res:list, m:int, n:int):
            if not m and not n: # 如果左右括号同时都用完了
                res.append(cur)
                return

            if m > n:# 剩下的左括号比右括号多,也就是说当前字符串中右括号比左括号还多,这一定是不能成对闭合的
                return 
            
            if m > 0: # 先放左括号
                backtrack(cur + "(", res, m-1, n)
            
            if n > 0: # 再放右括号
                backtrack(cur + ")", res, m, n-1)

        res = []    
        backtrack("", res, n, n)
        return res

            

发现代码写的好简洁。
看参考链接虽然不是最秀的,但至少能让你看得懂!,是先DFS遍历一遍,然后通过结束已经不符合条件的分支,实现剪枝。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n <= 0: return []
        res = []

        def dfs(paths, left, right):
            if left > n or right > left: return # 剪枝
            
            if len(paths) == n * 2:  # 因为括号都是成对出现的
                res.append(paths)
                return

            dfs(paths + '(', left + 1, right)  # 生成一个就加一个
            dfs(paths + ')', left, right + 1)

        dfs('', 0, 0)
        return res

感觉两个代码的结构挺相似的。都是回溯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个经典的回溯算法问题。以下是使用 Kotlin 解决的代码: ```kotlin class Solution { fun generateParenthesis(n: Int): List<String> { val result = mutableListOf<String>() backtrack(result, "", 0, 0, n) return result } private fun backtrack( result: MutableList<String>, current: String, open: Int, close: Int, max: Int ) { if (current.length == max * 2) { result.add(current) return } if (open < max) { backtrack(result, "$current(", open + 1, close, max) } if (close < open) { backtrack(result, "$current)", open, close + 1, max) } } } ``` 我们定义了一个 `Solution` 类,并在其中实现了 `generateParenthesis` 方法,该方法接受一个整数 `n`,代表要生成括号对数,返回一个有效的括号组合列表。 在 `generateParenthesis` 方法中,我们首先创建一个空的结果列表 `result`,然后调用 `backtrack` 方法开始回溯。 在 `backtrack` 方法中,我们首先检查当前字符串长度是否等于 `max * 2`,如果是,说明已经生成了一个有效的括号组合,将其添加到结果列表中,然后返回。 如果当前左括号数量小于 `max`,我们可以在当前字符串后面添加一个左括号,并增加左括号数量,继续回溯。 如果当前右括号数量小于左括号数量,我们可以在当前字符串后面添加一个右括号,并增加右括号数量,继续回溯。 最终,当回溯结束时,我们会得到所有可能的有效括号组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值