括号生成

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

例如,给出 n = 3,生成结果为:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

在真实的面试中遇到过这道题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        result =["()"]
        temp=[]
        for i in range(n-1):
            for j in result:
                for k in range(len(j)):
                    l=k
                    while l<len(j):
                        temp1=list(j)
                        temp1.insert(l,')')
                        temp1.insert(k,'(')
                        temp2="".join(temp1)
                        if temp2 not in temp:
                            temp.append(temp2)
                        l+=1
            result=temp
            temp=[]
        return result 

看到这道题第一想法是依次求出生成0对括号到n对括号的所有可能,即当我们要求i对括号的时候,我们遍历一下第i-1对括号的所有可能,考虑在其每种可能中插入一个新的括号来生成i对括号的的所有可能。刚开始插入的方式我们采取使用两个指针我们遍历所有可能的下标组合来实现插入。但是这种方法呢会导致重复,因为每次插入的都是一对括号。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n==0:
            return []
        dp=[None for _ in range(n + 1)]
        dp[0]=['']
        temp=[]
        for i in range(1,n+1):
            for j in range (i):
                left=dp[j]
                right=dp[i-j-1]
                for m1 in left:
                    for n1 in right:
                        temp.append('('+n1+')'+m1)
            dp[i]=temp
            temp=[]
        return dp[n]

第二种方法呢,实质上是对第一种方法的在插入方法上的改进,在求有i对括号生成的括号组合的时候其可分解为”(“+j对括号生成的括号组合其中一种+”)“+i-j+1对括号生成的括号组合其中一种
这样我们就解决了重复的问题

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        result =[]
        temp=''
        def dfs(temp,left,right):
            if left==0 and right==0:
                result .append(temp)
                return 
            if left>right:
                return 
            if left>0:
                dfs(temp+"(",left-1,right)
            if right>0:
                dfs(temp+')',left,right-1)
        dfs(temp,n,n)
        return result

第三种方法,dfs,其内在逻辑为
1.当left and right都大于零时,说明该组合即可加”(“也可加”)“
2.如果left>right说明我们先加了”)“不符合题意直接return
3.排除了2,其他情况只要left>0就可加”(“,只要right>0就可加”)“
4.当我们的left and right都等于0时,说明所有的括号都加完了,我们只去要将这种组合的方式append到result中就可以了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值