NO.22 括号生成

复制代码
# dfs的遍历
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n <= 0: return [] # 特例判断
        res = [] #设置返回列表

        def dfs(paths, left, right): #构造dfs函数进行遍历
            if left > n or right > left or right >n: return #出循环条件
            if len(paths) == n * 2:  # 因为括号都是成对出现的
                res.append(paths)
                return

            dfs(paths + '(', left + 1, right)  # 生成一个就加一个
            dfs(paths + ')', left, right + 1)

        dfs('', 0, 0)
        return res
总结一下本道回溯算法题:
    首先明确限制条件,n对括号那么最多n个'(',n个')',且要成为成对的括号
        因此需要满足俩个条件,插入数量不超过n,插入右括号的前提是左括号更多
    设置俩个变量path-保存走过的路径和res-返回最后的结果
    进行初始化dfs('',0,0)
复制代码
#动态规划
#思路:如果有一组,则为'()',那n组拆分后为'('+p+')'+q,其中p+q+1==n,p与q呈线性关系
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n==0:return []
        tl = []
        tl.append([None])# 0组括号记为None
        tl.append(['()'])# 1组括号记为'()'
        for i in range(2,n+1): # p组数目范围为(2,n),列表左闭右开
            t = [] # 设置空列表记录括号情况
            for j in range(i): #q组数目范围为(0,p-1)
                l1 = tl[j]# p=j的括号情况
                l2 = tl[i-1-j] # q=i-1-p的括号情况
                for k1 in l1:  # 遍历l1和l2的情况
                    for k2 in l2:
                        if k1 == None:
                            k1 = ""
                        if k2 == None:
                            k2 = ""
                        el = "(" + k1 + ")" + k2
                        t.append(el)    # 把所有可能的情况添加到 t 中
            tl.append(t)    # t这个list就是i组括号的所有情况,添加到tl中,继续求解i=i+1的情况
        return tl[n]
复制代码

 

复制代码

 

 
posted @   是冰美式诶  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示