暴力法
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
def generateAll(n):
if len(path) == n * 2:
if valid(path):
res.append("".join(path))
return
else:
path.append('(')
generateAll(n)
path.pop()
path.append(')')
generateAll(n)
path.pop()
def valid(path):
num = 0
for c in path:
if c == '(':
num += 1
elif c == ')':
num -= 1
if num < 0:
return False
return num == 0
path = list()
res = list()
generateAll(n)
return res
回溯法
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = list()
path = list()
def backtrack(path, left, right):
if left == n and right == n:
res.append(''.join(path))
return
if left < n:
path.append('(')
backtrack(path, left + 1, right)
path.pop()
if left > right:
path.append(')')
backtrack(path, left, right + 1)
path.pop()
backtrack(path, 0, 0)
return res
总结
1、暴力法是将全部2*n个的字符组合罗列出来(不一定左右括号各为n个),然后判断删除不符合要求的。
判断方法:依次读取字符串,num=0,左括号num+=1、右括号num-=1,若其中出现小于0的情况、或最后num!=0,则该字符串不符合要求。
2、递归是一种算法结构,而回溯是一种算法思想,它是用递归实现的,回溯的过程类似于穷举法,但回溯有“剪枝”功能,即自我判断过程。
3、回溯法在运行的过程中进行判断,只有符合要求的情况才添加括号,并进行递归。
判断方法:①当len(总长) == 2 * n
时停止;
②左括号长度小于n时,继续递归;
②右括号长度小于左括号长度时,继续递归。