它看似括号应该和栈有关系,其实他是个动态规划。在已知n = i 时候的情况,n = i+1时候,就相当于往n = i 的情况里添加一对括号。但是不能瞎填,不能在括进去格式不对的部分。为了保证这一点,其实 n<i 时候就已经能保证格式是有效的。所以就括进去之前的部分的就可以。
这个想法确实很巧妙啊,我之前就想从里面扣除成对的括号,其实n=i不只和n=i-1有关系。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n == 0:
return ""
dp = [None for _ in range(n+1)]
dp[0] = [""]
for i in range(n+1):
cur = []
for j in range(i):
# 从0到i 逐渐括进去
left = dp[j]
# 右侧的i-j-1 -1是为了保证加进去括号长度还是i
right = dp[i-j-1]
for s1 in left:
for s2 in right:
cur.append("("+s1+")"+s2)
dp[i] = cur
return dp[n]