这个题用动态规划的思路来做。初始化一个一维列表来记录 括号对数 <= 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数列得到的教训。能用栈就用栈吧,如果栈太复杂再考虑递归