22.括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

分析

左右括号匹配成对才能合法。

方法

思路一:数学归纳法 O(2^n)
n=1 ()
n=2 (()),()()
n=3 …

思路二:递归/深度优先搜索 O(2^2n)
知道n,就知道合法的字符串长度 为2n
在2n 长度内每个位置都有两种可能 所以整个的candidate 是2^2n 列举出所有可能,最后判断是否合法即可。

思路三:方法二的改进 进行剪枝O(2^n)
(1)局部不合法,不再递归,上来直接是右括号。
(2)每次记得左括号用了多少,右括号用了多少。用过一次记一次。

代码实现

class Solution(object):
	def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        self.list = []
        self._gen(0,0,n,'')
    
    def _gen(self,left,right,n,result):   # left ,right 表示已经用了多少个
        if left ==n and right ==n:
            self.list.append(result)
            return
        if left < n:
            self._gen(left +1,right,n,result+'(')
        if left > right and right < n:
            self._gen(left,right+1,n,result+')')

TIPS

代码风格小tips :
(1)if 后最好有空格
(2){ 之前也最好有空格,且不要另起一行
(3)缩进最好是2个空格,并非4个空格
(4)递归终止条件最好可以先列出来
python coding style goole

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值