class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A): #回溯生成函数
if len(A) == 2*n: #递归出口
if valid(A): #调用验证
res.append(''.join(A))
return
#经典回溯
A.append('(')
generate(A)
A.pop()
A.append(')')
generate(A)
A.pop()
def valid(A): #验证函数
bal = 0 #balance,遇到左括号+1,右括号-1
for ch in A:
if ch == '(': bal += 1
else: bal -= 1
if bal < 0: return False #若右括号先出现
return bal == 0
res = []
generate([])
return res
简化写法:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A):
if len(A) == 2*n:
if (valid(A)):
res.append(''.join(A))
return
#简洁回溯
generate(A + ['('])
generate(A + [')'])
def valid(A): #验证函数
bal = 0 #balance,遇到左括号+1,右括号-1
for ch in A:
if ch == '(': bal += 1
else: bal -= 1
if bal < 0: return False #若右括号先出现
return bal == 0
res = []
generate([])
return res
将generate函数中参数A由list改为字符串,更加直接:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A):
if len(A) == 2*n:
if (valid(A)):
res.append(A)
return
generate(A + '(')
generate(A + ')')
def valid(A): #验证函数
bal = 0 #balance,遇到左括号+1,右括号-1
for ch in A:
if ch == '(': bal += 1
else: bal -= 1
if bal < 0: return False #若右括号先出现
return bal == 0
res = []
generate('')
return res
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A, left, right):
if len(A) == 2*n:
res.append(''.join(A))
return
if left < n:
generate(A+['('], left+1, right)
if right < left:
generate(A+[')'], left, right+1)
res = []
generate([], 0, 0)
return res
简化:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A, left, right):
if len(A) == 2*n:
res.append(A)
return
if left < n:
generate(A + '(', left+1, right)
if right < left:
generate(A + ')', left, right+1)
res = []
generate('', 0, 0)
return res