zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    libmegjb.so加载问题调试和分析
    art虚拟机启动问题分析
    高通发布骁龙808六核/810八核64位芯片
    pivotx的entry和page内容里的日期格式修改
    dlmalloc(Android bionic C库的malloc实现)简介
    dojo分析之declare接口
    零基础搞懂智能机之手机参数怎么看
    Google one联合联发科,国内低端智能机方案怎么办?
    自己搭建云存储(WIFI路由器上接硬盘)
    数据结构目录(浙大)
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/12698079.html
Copyright © 2011-2022 走看看