括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解题思路:使用递归加回溯,统计出现的不同情况。
class Solution:
def __init__(self):
self.lists = []
def generateParenthesis(self, n: int) -> List[str]:
if n==0: # 如果括号数为0,直接返回空列表
return []
def generfun(strs,n,num1,num2):
# num1是初始左括号,num2是初始右括号
if num1 == num2 == n: # 递归停止条件
if strs not in self.lists:
self.lists.append(strs[:])
return
if num1 < num2: # 左括号少于右括号,直接返回
return
if num1<n: # 当左括号数量小于n,左括号加1,进行递归
strs += '('
generfun(strs,n,num1+1,num2)
strs = strs[:-1] # 回溯
if num2<n: # 当右括号数量小于n,右括号加1,进行递归
strs += ')'
generfun(strs,n,num1,num2+1)
strs = strs[:-1] # 回溯
generfun("",n,0,0)
return self.lists