题目
给出正整数n,要求生成所有的由n对括号组成的合法组合
例如:n=3,生成:“((()))”, “(()())”, “(())()”, “()()()”, “()(())”
递归回溯
概括思路:
若左括号未达到上限,优先在当前位置添加左括号,并对添加后的问题再求解;
若①左括号已达上限,或②本位置添加左括号后的问题已求解完,弹出了刚才添加的左括号,且当前还缺右括号,则添加右括号继续求解
有点别扭,画个图示意。。(n=2)
设置列表dst
,存放所有生成的合法括号串
设置列表cell
,存放当前已生成的字符串
设置变量left
和right
,记录当前cell
中的左括号和右括号数量
进行递归:
- 若cell长度已为
2n
,将其加入最终结果中,退递归
否则: - 若当前
左括号数量<n
,说明还可以继续加左括号,添加一个左括号,对添加后的字符串继续递归,出递归后将刚才添加的左括号弹出(回溯) - 若当前
右括号数量<左括号数量
,说明缺少右括号,添加一个右括号,对添加后的字符串继续递归,出递归后将刚才添加的右括号弹出(回溯)
代码
class Solution:
def rr(self, cell, dst, n, left, right):
if len(cell) == n * 2:
dst.append(''.join(cell))
return
# 左括号数量<n,添加左括号
if left < n:
cell.append('(')
self.rr(cell, dst, n, left + 1, right)
cell.pop()
# 右括号数量<左括号,添加右括号
if right < left:
cell.append(')')
self.rr(cell, dst, n, left, right + 1)
cell.pop()
def generateParenthesis(self, n):
cell, dst = [], []
left, right = 0, 0
self.rr(cell, dst, n, left, right)
return dst
参考链接:https://blog.nowcoder.net/n/83c55b7d50fd4cc6b5e4f56edabbdd03?f=comment
还有份之前写的代码,超时
思路是对每个位置插入左括号,再在左括号后插入右括号,继续递归
class Solution:
def listToStr(self, arr):
dst = ''
for char in arr:
dst += char
return dst
def rr(self, cell, dst, n):
if len(cell) == n * 2:
bracesStr = self.listToStr(cell)
if bracesStr not in dst:
dst.append(bracesStr)
return
for i in range(0, len(cell)):
cell.insert(i, '(')
for j in range(i + 1, len(cell)):
cell.insert(j, ')')
self.rr(cell, dst, n)
cell.pop(j)
cell.pop(i)
def generateParenthesis(self, n):
if n == 1:
return ['()']
cell, dst = ['(', ')'], []
self.rr(cell, dst, n)
return dst