括号生成(leetcode-22)

题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

思路

动态规划。假设我们已知\(n=1,2,...,k-1\)时的所有括号组合,那么\(n=k\)的组合可以看成在\(n=k-1\)的情况种增加一个括号。我们这样构造:
最左边一定是左括号(因为要合法),这样我们需要在余下的字符串中选出一个右括号。为什么这么做?因为这样可以把\(n\)个括号的字符串划分成两个子字符串,即\((A)B\)

那么\(A\)中可以包含\(0,1,2,...k-1\)个括号,而相应的\(B\)需要包含\(k-1,k-2,k-3,...1,0\)个括号。我们只需遍历这些组合情况即可。

需要注意的是,因为要遍历特定长度(括号数量)的不同情况,因此我们必须保存\(n\)为不同数量下的括号组合情况

代码

class Solution:
    def generateParenthesis(self, n):
        case = [[''], ['()']]     # 保存所有的答案
        if n == 0:
            return []
        elif n == 1:
            return ['()']
        # 从1开始递推后面的情况
        for i in range(2, n + 1):
            current_case = []
            # 根据递推关系,需要遍历前n-1种情况,并将其组合
            for j in range(i):
                # 用第j种情况的第k1个括号生成A
                for k1 in range(len(case[j])):
                    # 用第i-j种情况的第k2个括号生成B
                    for k2 in range(len(case[i-j-1])):
                        current_case.append('(' + case[j][k1] + ')' + case[i-j-1][k2])
            case.append(current_case)
        return case[n]

posted @ 2020-10-27 21:33  Destiny233  阅读(77)  评论(0)    收藏  举报