算法-leetcode22 括号生成

文章介绍了两种解决LeetCode上的括号生成问题的方法:一是使用动态规划,通过状态转移方程式生成所有可能的有效括号组合,并去除重复;二是利用深度优先遍历(DFS),在保证左括号数量大于等于右括号数量的条件下生成所有合法括号序列。
摘要由CSDN通过智能技术生成

22. 括号生成 -力扣(LeetCode)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

方法1:使用动态规划方法:

f(n)="("+p+")"+q 其中:e=p+q e属于f(n-1)中的任意元素

有人会质疑,上面的结果一定时合法的括号组合吗?一个括号最后是否合法判断1,左括号数量=右括号数量  2,先添加左括号,再添加右括号。

以上状态转移方程式的最后的结果有重复,最后要去重。

python代码:

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        a=[]
        a.append([""])
        a.append(["()"])
        for i in range(1,n+1):
            temp=set()
            for e in a[i]:
                for j in range(0,len(e)):
                    temp.add("("+"".join(e[0:j])+")"+"".join(e[j:]))
            a.append(list(temp))
        return sorted(a[n])

方法2,深度优先遍历 dfs

条件:任何一个合法的括号,不管在哪个位置分割,都是左括号大于等于右括号的状态,若是右>左,则判定为不合法的括号组合。

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res=[]
        def parenthesis_dfs(ln,rn,s):
            if ln==n and rn==n:
                res.append(s)
                return 
            if rn>ln: //不合法的括号组合,舍弃
                return
            if ln<n:
                parenthesis_dfs(ln+1,rn,s+"(")
            if rn<n:
                parenthesis_dfs(ln,rn+1,s+")")
        parenthesis_dfs(0,0,"")
        return sorted(res)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值