题目
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
输入一个数字n,看有多少种匹配的括号组合。
回溯+剪枝
这题是判断括号是否合法的变形,合法括号需满足的条件是:1、所有左括号数量等于所有右括号数量;2、从左到右的左括号数量大于等于右括号数量。
这题可以看作是有 2n 个位置,每个位置可以放置”(“ 或者 ” ) “,组成的所有括号组合中,有多少个是合法的。
回溯条件是:选择、路径和终止条件
那么选择就是”(“或者”)“,路径是从左到右穷举的满足条件的组合,终止条件可以换一个思路,设剩余可用的左右括号数量,如果都等于0说明需终止。
python代码
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n==0:
return []
res = []
track = ""
self.backtrack(n,n,track,res)
return res;
def backtrack(self,left,right,track,res):
if right<left:
return
if left<0 or right<0:
return
# 当所有括号都恰好用完时,得到一个合法的括号组合
if left ==0 and right ==0:
res.append(track)
return
track+="("
self.backtrack(left-1,right,track,res)
track = track[:-1]
track+= ")"
self.backtrack(left,right-1,track,res)
track = track[:-1]