题解 | #括号生成#
括号生成
https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca
在BM56基础上,加入剪枝操作:
- 合法的括号顺序是,'(' 和 ')' 相互抵消后,排第一的一定是'(';
- 令'('==1, ')'==-1,递归时保证,arr和>=0,就是合法的。
import copy class Solution: # 设'('==1, ')'==-1,递归时保证arr的和>=0,就是合法的 res = [] def generateParenthesis(self , n: int) -> List[str]: num = [] for i in range(n): num.append(1) num.append(-1) num.sort() mark = [0 for i in range(len(num))] arr = [] self.full_permute(num,arr,mark) ans = [] for l in Solution.res: # 将1 -1转成( ) s = [] for n in l: s.append('(' if n==1 else ')') ans.append(''.join(s)) return ans def full_permute(self,num,arr,mark): if len(arr) == len(num): Solution.res.append(copy.deepcopy(arr)) for i in range(len(num)): # 判断是否已在arr中 # 判断是否重复排列 # 判断是否合法 if mark[i]==1 or i>0 and num[i]==num[i-1] and mark[i-1]==0 or num[i]+sum(arr)<0: continue arr.append(num[i]) mark[i]=1 self.full_permute(num,arr,mark) arr.pop() mark[i]=0