这个题用动态规划的思路来做。初始化一个一维列表来记录 括号对数 <= n 的所有状态,如 dp[3] 包含括号对数为3的所有序列。只要保证从第一个状态是正确的序列,设计好状态转移,就可以保证后续得到的所有括号序列都是正确的
初始条件:dp[0] = [""]
状态转移:temp = "(" + neck + ")" + tail,其中neck是括号对数为m的序列 (取自 dp[m] ),tail是括号对数n的序列 (取自 dp[n] ),temp将存进 dp[m + n + 1] 的列表
代码很简单,如下:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
dp = [[] for _ in range(n + 1)]
dp[0].append("")
for pairs in range(1, n + 1):
# 当前想得到的括号对数
for tail_n in range(pairs):
# tail部分的括号对数
for neck in dp[pairs - 1 - tail_n]:
for tail in dp[tail_n]:
temp = "(" + neck + ")" + tail
dp[pairs].append(temp)
return dp[-1]
还有另一种思路是利用了括号序列的的一个性质,string[: n] 恒满足:"("的个数 >= ")"的个数。然后用递归函数来逐个添加字符。我个人不喜欢递归,做Fibonacci数列得到的教训。能用栈就用栈吧,如果栈太复杂再考虑递归