其他分享
首页 > 其他分享> > NO.22 括号生成

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]

 

 

 

标签:right,return,dfs,生成,括号,tl,NO.22,append
来源: https://www.cnblogs.com/158-174/p/16470712.html