博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode每天一题】Generate Parentheses(创造有效的括弧)
阅读量:6116 次
发布时间:2019-06-21

本文共 2111 字,大约阅读时间需要 7 分钟。

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 = 017             for c in A:18                 if c == '(': bal += 119                 else: bal -= 120                 if bal < 0: return False21             return bal == 022 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 res13         14     def get_res(self, s, res, left,right, n):15         if len(s) == n*2:            # 直接将结果添加进结果集中16             res.append(s)17             return18         if left < n:                # 左括号小于n时,直接进行添加。并且left+119             self.get_res(s+'(', res, left+1, right, n)   20         if right < left:21             self.get_res(s+')', res, left, right+1, n)22

转载于:https://www.cnblogs.com/GoodRnne/p/10661039.html

你可能感兴趣的文章
iOS 应用内跳转到系统设置
查看>>
[ACM] ZOJ 3725 Painting Storages (DP计数+组合)
查看>>
Ghost本地安装highlight.js使代码高亮
查看>>
HDU 2819 Swap (行列匹配+输出解)
查看>>
Linux基础
查看>>
js,jQuery和DOM操作的总结(一)
查看>>
Linux 安全密钥验证
查看>>
Unity3D使用经验总结 缺点篇
查看>>
在如下值 li=[11,22,33,44,55,,66,77,88,99,90],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个可以的值中...
查看>>
WordPress计数插件
查看>>
s5pv210移植Minigui3.0.12
查看>>
POJ - 2151 (概率dp)
查看>>
%和format 细说
查看>>
Linux中的正则表达式
查看>>
Nginx中文手册
查看>>
招财铃:openfire 流程 二,
查看>>
自己使用docker中常用的命令
查看>>
文本处理工具几脚本
查看>>
IOC
查看>>
滑雪在日本 之 新泻篇 12
查看>>