def generate(n: int):
def iter_(ns):
if ns == 1: # n = 1递归结束
yield "()"
else:
last_result = list(iter_(ns - 1))
# 第一种情况在前面
for i in last_result:
yield "()" + i
# 第二种情况包含
for i in last_result:
yield "(" + i + ")"
# 第三种情况在右边
for i in last_result:
if i != "()" * (ns - 1): # 去掉对称的情况
yield i + "()"
return list(iter_(n))
assert sorted(generate(3)) == sorted(["((()))", "(()())", "(())()", "()(())", "()()()"])
assert sorted(generate(1)) == sorted(["()"])
def generate(n: int):
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
assert sorted(generate(3)) == sorted(["((()))", "(()())", "(())()", "()(())", "()()()"])
assert sorted(generate(1)) == sorted(["()"])
def generate(n: int):
s_list = []
start_list = ['('] * n + [')'] * n
res_set = set(itertools.permutations(start_list, n * 2))
res_list = [''.join(item) for item in res_set]
for i in res_list:
s = 0
valid = True
for j in i:
if j == '(':
s += 1
elif j == ')':
s -= 1
if s < 0:
valid = False
break
if valid and s == 0:
s_list.append(i)
return s_list
assert sorted(generate(3)) == sorted(["((()))", "(()())", "(())()", "()(())", "()()()"])
assert sorted(generate(1)) == sorted(["()"])