给定一个n,问你所有n个合法括号的组合。
用递归,每一次选择左括号或后括号,选左括号的条件是左括号的数目小于n,选右括号的条件是右括号的数目小于左括号的数目,递归后记得还原现场,递归出口是右括号的数目等于n,把这个组合加入到答案列表里然后返回。
见鬼了,同样的思路和实现,用台式机做出来了,当时用笔记本电脑就做不对。:)
def dfs(num_left, num_right, sub_ans_str, ans_list, n):
if num_right==n and num_left==n: # 或者只是 num_right==n, 因为当num_right==n时一定有num_left==n,因为设置了num_right<num_left的条件,进入dfs的时候num_righ永远只能是<=num_left
ans_list.append(sub_ans_str[:])
return
# 选左边
if num_left < n:
sub_ans_str += "("
dfs(num_left+1, num_right, sub_ans_str, ans_list, n)
sub_ans_str = sub_ans_str[:-1]
# 选右边
if num_right < num_left:
sub_ans_str += ")"
dfs(num_left, num_right+1, sub_ans_str, ans_list, n)
sub_ans_str = sub_ans_str[:-1]
return
n = 3
num_left = 0
num_right = 0
sub_ans_str = ""
ans_list = []
dfs(num_left, num_right, sub_ans_str, ans_list, n)
print(ans_list)