方法一:暴力法
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A):
if len(A) == 2*n:
if valid(A):
ans.append("".join(A))
else:
A.append('(')
generate(A)
A.pop()
A.append(')')
generate(A)
A.pop()
def valid(A):
bal = 0
for c in A:
if c == '(': bal += 1
else: bal -= 1
if bal < 0: return False
return bal == 0
ans = []
generate([])
return ans
方法二:回溯法
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
def backtrack(S, left, right):
if len(S) == 2 * n:
ans.append(''.join(S))
return
if left < n :
S.append('(')
backtrack(S, left + 1, right)
S.pop()
if right < left:
S.append(')')
backtrack(S, left, right+1)
S.pop()
backtrack([], 0, 0)
return ans
方法三:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n == 0:
return ['']
ans = []
for c in range(n):
for left in self.generateParenthesis(c):
for right in self.generateParenthesis(n-1-c):
ans.append('({}){}'.format(left, right))
return ans
方法四:动态规划
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
dp = [[] for _ in range(n+1)]
dp[0] = [""]
for i in range(1, n+1):
for p in range(i):
l1 = dp[p]
l2 = dp[i-p-1]
for k1 in l1:
for k2 in l2:
dp[i].append("({0}){1}".format(k1, k2))
return dp[n]