• 22. 括号生成


    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

    示例:

    输入:n = 3
    输出:

    ["((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
    ]

    方法一:暴力法

    为了生成所有序列,我们可以使用递归。长度为 n 的序列就是在长度为 n-1 的序列前加一个 '(' 或 ')'。

    为了检查序列是否有效,我们遍历这个序列,并使用一个变量 balance 表示左括号的数量减去右括号的数量。如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。

    class Solution:
        def generateParenthesis(self, n: int) -> List[str]:
            def generate(A):
                if len(A) == 2*n:
                    if valid(A):
                        ans.append("".join(A))
                else:
                    A.append('(')
                    generate(A)
                    A.pop()
                    A.append(')')
                    generate(A)
                    A.pop()
    
            def valid(A):
                bal = 0
                for c in A:
                    if c == '(': bal += 1
                    else: bal -= 1
                    if bal < 0: return False
                return bal == 0
    
            ans = []
            generate([])
            return ans
    

    方法二:回溯法

    方法一还有改进的余地:我们可以只在序列仍然保持有效时才添加 '(' or ')',而不是像 方法一 那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果左括号数量不大于 nn,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。

    class Solution:
        def generateParenthesis(self, n: int) -> List[str]:
            ans = []
            def backtrack(S, left, right):
                if len(S) == 2 * n:
                    ans.append(''.join(S))
                    return
                if left < n:
                    S.append('(')
                    backtrack(S, left+1, right)
                    S.pop()
                if right < left:
                    S.append(')')
                    backtrack(S, left, right+1)
                    S.pop()
    
            backtrack([], 0, 0)
            return ans


    链接:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode-solution/

  • 相关阅读:
    pyspark使用及原理
    谷歌地图聚合点使用(GoogleMaps MarkerCluster)
    struts2升级到2.5的配置
    二进制反码补码
    进制转换
    JAVA基础第一章
    TypeError: unhashable type: 'list' 如何解决?
    剪辑模板
    Mysql三天入门(三) 数据库设计的三范式
    Mysql三天入门(三) DBA命令
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/12698079.html
Copyright © 2020-2023  润新知