码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 来自北大算法课的Leetcode题解:22. 括号生成


    本题代码:https://github.com/doubleZ0108/Leetcode/blob/master/22.括号生成.py

    • 解法1(超时):看数据规模不大,本来想暴力解。首先将n个(和n个)加入到数组中,然后调用库函数itertools.permutations()进行全排列,并通过集合set()去重,最后再依次判断每个可能的组合是否合法,可以根据20题的算法用栈来判断括号是否匹配
    • 解法2(T60% S90%):又是经典的深搜(携带参数递归),递归参数设定为cur代表当前做到的下标位置,li代表这一种情况的括号组成,还有两个参数leftCount和rightCount代表当前位置之前左右括号的数量。
      • 初始:cur=1(因为第一个必须是(),li的首元素是( 其余为空,leftCount=1,rightCount=0
      • 终止条件:如果leftCount或rightCount大于n则直接返回,当前解不可能(事实上只判断leftCount就好,rightCount不可能大于n);如果cur指到最后位置2n了就可以将当前li转换为字符串加入结果中了
      • 递归:如果leftCount>rightCount,代表之前肯定有一个(,则可以把当前位置放一个)并递归;否则当前位置只能放(再递归
    class Solution(object):
        def generateParenthesis(self, n):
            """
            :type n: int
            :rtype: List[str]
            """
            res = []
    
            def gen(cur, li, leftCount, rightCount):
                if leftCount>n: return
                if cur == 2*n:
                    res.append("".join(li))
                    return
                if leftCount > rightCount:
                    li[cur] = ')'
                    gen(cur+1, li, leftCount, rightCount+1)
                li[cur] = '('
                gen(cur+1, li, leftCount+1, rightCount)     
                
            li = ['' for _ in range(2*n)]
            li[0] = '('
            gen(1, li, 1, 0)
            return res
    
    
        def otherSolution(self, n):
            # 解法1 超时
            def isValid(item):
                stack = []
                for s in item:
                    if s == '(': stack.append(s)
                    else:
                        if len(stack)<=0: return False
                        if stack.pop() != '(': return False
                return stack==[]
    
            li = []
            for i in range(n): 
                li.append('(')
                li.append(')')
    
            from itertools import permutations
            li = list(set(permutations(li)))
    
            res = []
            for item in li:
                if isValid(item): res.append("".join(item))
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    使用Redux-Toolkit,由“object is not extensible”引发的思考及解决方案
    [附源码]Python计算机毕业设计Django校园招聘系统设计
    什么是“path”环境变量?path的作用是什么?
    wpf prism 中使用automapper
    JavaScript【字符串方法(charAt()、concat()、slice()、substring()、substr()、indexOf()/lastIndexOf()、trim())】(五)
    JDK版本对应其major.minor version,看这一篇就够啦(附java历史版本下载地址)
    ChatGPT OpenAI 完成Excel组合函数Vlookup+match多条件查找
    车辆信息查询API-支持车牌号码快速查询
    【Go语言学习笔记】函数
    一招告别百度广告烦恼,同时效率提高100倍的几个常用搜索技巧!
  • 原文地址:https://blog.csdn.net/double_ZZZ/article/details/126347605
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号