• 【LeetCode每天一题】Generate Parentheses(创造有效的括弧)


    Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.    For example, given n = 3, a solution set is

    [

      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]
    思路

      比较简单的方法是暴力破解法我们生成所有可能的组合,然后逐一去判断他们是否满足要求,最后输出一个满足的集合。但是这种方法当n非常大时,会存在时间复杂度非常高的问题。这会导致运行时间超时。
      时间复杂度为(22nn), 对于n个字符串可以产生22n个结果,然后每一个结果需要判断其是否有效,遍历需要O(n)。空间复杂度为(22nn)。
      另外一种方法是,我们可以根据有效括弧的规则来进行判断,当'('不为0时,可以一直添加,而')'的添加,我们需要满足他的添加个数不能大于'('的数量,否则直接为无效的括弧。

    暴力破解思路

    
    
     1 class Solution(object):
     2     def generateParenthesis(self, n):
     3         def generate(A = []):
     4             if len(A) == 2*n:          # 当'(',')'都添加完毕之后,先进行判断是否有效,有效添加进结果集。
     5                 if valid(A):
     6                     ans.append("".join(A))
     7             else:
     8                 A.append('(')          # 递归方法产生, 每一次时都会有两种选择,添加'('或者')'。
     9                 generate(A)
    10                 A.pop()
    11                 A.append(')')
    12                 generate(A)
    13                 A.pop()
    14 
    15         def valid(A):            # 判断当前是否是有效括弧。
    16             bal = 0
    17             for c in A:
    18                 if c == '(': bal += 1
    19                 else: bal -= 1
    20                 if bal < 0: return False
    21             return bal == 0
    22 
    23         ans = []               # 存储有效结果的括弧
    24         generate()
    25         return ans
    第二种解决代码

     1 class Solution(object):
     2     def generateParenthesis(self, n):
     3         """
     4         :type n: int
     5         :rtype: List[str]
     6         """
     7         if n <2:             # 小于2时,直接根据值进行返回。
     8             return '' if n == 0 else ['()']
     9         res = []           # 存储结果集
    10         s=''              
    11         self.get_res(s, res, 0, 0 , n)   # 调用制造函数
    12         return res
    13         
    14     def get_res(self, s, res, left,right, n):
    15         if len(s) == n*2:            # 直接将结果添加进结果集中
    16             res.append(s)
    17             return
    18         if left < n:                # 左括号小于n时,直接进行添加。并且left+1
    19             self.get_res(s+'(', res, left+1, right, n)   
    20         if right < left:
    21             self.get_res(s+')', res, left, right+1, n)
    22         
  • 相关阅读:
    浅拷贝和深拷贝
    强大的VS插件CodeRush发布v19.1.4|支持Visual Studio 2019
    DevExpress v19.1新版亮点——WinForms篇(三)
    MyEclipse使用教程:使用Workbench和Perspectives
    「版本升级」界面控件Kendo UI正式发布R2 2019|附下载
    DevExpress v19.1新版亮点——WinForms篇(二)
    CodeMix使用教程:构建自定义DevStyle主题
    DevExpress v19.1新版亮点——WinForms篇(一)
    MyEclipse XML & XML架构教程:XML Schema (XSD)编辑器
    VCL界面控件DevExpress VCL Controls发布v18.2.7|附下载
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10661039.html
Copyright © 2020-2023  润新知