LeetCode 22.括号生成

题目描述

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思路

这种方法是 CareerCup 书上给的方法,是蛮巧妙的一种方法。
核心思想是找左括号:
每找到一个左括号,就在其后面加一个完整的括号,最后再在开头加一个 (),就形成了所有的情况,
需要注意的是,有时候会出现重复的情况,所以我们用 Set 这种数据结构,好处是如果遇到重复项,不会加入到结果中,最后我们再把 Set 转为 List 即可。

代码

class Solution:
    def generateParenthesis(self, n: int) -> List[str]: 
        if n == 0:
            return []
        if n == 1:
            return ["()"]
        if n == 2:
            return ["(())","()()"]
        total = [["()"],["(())","()()"]]
        for i in range(1,n-1):   #注意,取n-1而不要取n,因为取n最后total会生成到n+1个括号的情况,而我们只要n个括号的情况
            par = []            #用于存放i+1个括号的所有情况
            for j in range(len(total[i])): #遍历total中i个括号组成的所有情况
                s =total[i][j]             #取total中i个括号所有情况中的第j个情况
                for k in range(len(s)):    #遍历这个情况下的所有左括号
                    s_tmp = list(s) #s_tmp会变化,所以不要直接用s否则s长度发生变化,导致遍历失败,这里新开一个s_tmp变量来存放结果
                    if s[k]=="(":
                        s_tmp[k] = "(()"      #遇到左括号就添加一个完整括号,相当于把"("换成"(()"
                        par.append("".join(s_tmp)) #让s_tmp从列表再转回字符串
                        par.append("()"+s)   #添加多一个情况,就是再原来情况下,在前面多加一个"()"
            total.append(list(set(par)))  #去重
        return total[n-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值