括号生成
1、递归
注意官方的暴力解法,用递归生成所有符合条件的情况,这个与我之前理解的递归的使用完全不同,之前的递归我将其理解为直接将上次函数执行的结果拿过来用,不起考虑具体的实现方式,只要知道结果就行,但是这个递归,用到了具体的每一个结果,换句话说,他用非常简单的递归实现了需要非常复杂的遍历才能实现的功能。这里需要再进一步理解!
具体为:
def generate(A):
if len(A)==2*n:
ans.append(A)
else:
A += '('
generate(A)
A = A[:-1] # 原来是使用列表,这一步就是pop
A+=')'
generate(A)
A = A[:-1]
2、是否合法
另外,官方判断一个
“((()))(((”
这样的括号字符串是否合法使用的是非常简单的遍历:
def is_valid(S): # 很简单,但是只适用于只含有一种括号的情况
bal = 0 # 记录左括号和右括号的个数差,如果小于0直接不合法
for i in S:
if i == '(':
bal += 1
else:
bal -= 1
if bal < 0: return False
return bal == 0 #如果最后还有多的也不合法
3、DP
这一题,我认为最简单也是最理想的方式应该是动态规划 DP 虽然比较难想到,但这才是一道算法题的解法