22. Generate Parentheses*

题目:

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

Example 1:

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]

Example 2:

Input: n = 1
Output: ["()"]

Constraints:

  • 1 <= n <= 8

解法:

解法一:

其实这个跟上一个电话号码的题类似,我的思路是假设原字符串为(),则新加入的一对括号有三个位置,第一个字符之前(最前面)、第二个字符之前(中间)和第二个字符之后(最后面)。假设原字符串为()(),则新加入的一对括号有五个可能的位置,即第一个字符之前、第二个字符之前......第四个字符之后。

但是由于我用了两个集合,所以空间占用较多,仅少于10.75%的python3提交者

    def generateParenthesis(self, n: int) -> List[str]:
        r=set(['()'])
        s=set()
        i=1
        while(i<n):
            for item in r:
                for j in range(0,len(item)):
                    str_list = list(item)
                    str_list.insert(j, '()')
                    s.add(''.join(str_list))
            r=s.copy()
            s.clear()
            i+=1
        return list(r)

解法二:

看了评论里https://leetcode.com/StefanPochmann的三种解法,emmm...我用的是假的python吧

def generateParenthesis(self, n):
    def generate(p, left, right, parens=[]):
        if left:         generate(p + '(', left-1, right)
        if right > left: generate(p + ')', left, right-1)
        if not right:    parens += p,
        return parens
    return generate('', n, n)

用了递归的方法,需要注意的是parens这个数组。python对可变默认参数的处理,以List为例:List只有在函数定义的时候被初始化,后面每次调用用的都是同一个list。所以可以看到在这个解法中,多次调用generate函数,结果均添加到同一个parens中了。

解法三:

def generateParenthesis(self, n):
    def generate(p, left, right):
        if right >= left >= 0:
            if not right:
                yield p
            for q in generate(p + '(', left-1, right): yield q
            for q in generate(p + ')', left, right-1): yield q
    return list(generate('', n, n))

emmm...讲道理我并不是很理解,但是借此机会学习了一下yield的用法。

1.通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它的缺陷是所有数据都在内存中,如果有海量数据的话会非常耗内存。

2.yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用时不会执行该函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行函数内部的代码,执行到 yield时,函数就返回一个迭代值,下次迭代时,代码从 yield的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

解法四:

def generateParenthesis(self, n, open=0):
    if n > 0 <= open:
        return ['(' + p for p in self.generateParenthesis(n-1, open+1)] + \
               [')' + p for p in self.generateParenthesis(n, open-1)]
    return [')' * open] * (not n)

emmm...有点放弃理解了,最后一行,not n,只有n=0时,才是True,其它任何正数负数,都是False。所以最后一行,只有n=0才会返回open个')',其它时候返回[]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值