【Leetcode 22】括号生成

题目描述

在这里插入图片描述

解题思路

括号对数 生成的有效括号
0对括号 [None]
1对括号 [’()’]
2对括号 [’()()’,’(())’]
3对括号 [’()()()’,’()(())’,’(())()’,’(()())’,’((()))’]

思路一:

首先将0组括号记为None,1组括号记为()

  • 当计算2组括号时,2组括号生成的有效括号必然是在1组括号的基础上生成的,它一定是一个左括号和与之对应的右括号,是相比1组括号多出来的,要解决的是1组括号是放到新增括号的内部还是外部。
    简单来说,对于求n对括号生成的有效括号,分成单独一对括号和n-1对有效括号两部分,n-1对括号仅有可能存在一对括号内部或者外部
  • 不管计算几组括号生成的有效括号,均采用以上这种思想,当计算3组括号时,令i=3,括号p+q<=i-1,则分为几种情况:p=0,q=2;p=1,q=1;p=2,q=0。
    对所有情况进行遍历:
    “(” + 【i=p时所有括号的排列组合】 + “)” + 【i=q时所有括号的排列组合】

    p=0,q=2:’()()()’,’()(())’
    p=1,q=1:’(())()’
    p=2,q=0:’(()())’,’((()))’

python代码

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n == 0:
            return []
        total_l = []
        total_l.append([None])    # 0组括号时记为None
        total_l.append(["()"])    # 1组括号只有一种情况
        for i in range(2,n+1):    # 开始计算i组括号时的括号组合
            l = []        
            for j in range(i):    # 开始遍历 p q ,其中p+q=i-1 , j 作为索引
                now_list1 = total_l[j]    # p = j 时的括号组合情况
                now_list2 = total_l[i-1-j]    # q = (i-1) - j 时的括号组合情况
                for k1 in now_list1:  
                    for k2 in now_list2:
                        if k1 == None:
                            k1 = ""
                        if k2 == None:
                            k2 = ""
                        el = "(" + k1 + ")" + k2
                        l.append(el)    # 把所有可能的情况添加到 l 中
            total_l.append(l)    # l这个list就是i组括号的所有情况,添加到total_l中,继续求解i=i+1的情况
        return total_l[n]
if __name__ == '__main__':
    s = Solution()
    res = s.generateParenthesis(3)
    print(res)
发布了56 篇原创文章 · 获赞 1 · 访问量 1666

猜你喜欢

转载自blog.csdn.net/weixin_44549556/article/details/105400213