这个题我想起了Catalan数,但是这个直接给出的是有效组合的数目。这个笔记是看的B站韩老师的视频【数学思维与文化漫谈】卡塔兰数——组合数学的重要内容&中小学数学竞赛的重要考点
但是代码就不知道怎么体现这个过程。
参考这个链接LeetCode 刷题笔记——递归与回溯的理解写的python代码。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def backtrack(cur:str, res:list, m:int, n:int):
if not m and not n: # 如果左右括号同时都用完了
res.append(cur)
return
if m > n:# 剩下的左括号比右括号多,也就是说当前字符串中右括号比左括号还多,这一定是不能成对闭合的
return
if m > 0: # 先放左括号
backtrack(cur + "(", res, m-1, n)
if n > 0: # 再放右括号
backtrack(cur + ")", res, m, n-1)
res = []
backtrack("", res, n, n)
return res
发现代码写的好简洁。
看参考链接虽然不是最秀的,但至少能让你看得懂!,是先DFS遍历一遍,然后通过结束已经不符合条件的分支,实现剪枝。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n <= 0: return []
res = []
def dfs(paths, left, right):
if left > n or right > left: return # 剪枝
if len(paths) == n * 2: # 因为括号都是成对出现的
res.append(paths)
return
dfs(paths + '(', left + 1, right) # 生成一个就加一个
dfs(paths + ')', left, right + 1)
dfs('', 0, 0)
return res
感觉两个代码的结构挺相似的。都是回溯。