leetcode 22 括号生成
递归找到所有可能解,通过判断看解是否可行,进行筛选。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
hashmap={'(':')'}
def check(s):
balance=0
stack=[]
for i in s:
if not stack or stack[-1] not in hashmap.keys() or hashmap[stack[-1]]!=i:
stack.append(i)
else:
if stack[-1] in hashmap.keys() and hashmap[stack[-1]]==i:
stack.pop()
if stack:
return False
else:return True
def dfs(t,n,result,allresult):
if t==n:
if check(result):
allresult.append(result)
return
dfs(t+1,n,result+'(',allresult)
dfs(t+1,n,result+')',allresult)
allresult=[]
dfs(0,n*2,'',allresult)
return allresult另一种判断生成的括号序列是否合法的方法,维护一个balance值,当序列中'('就加1,否则减1,这样在循环中如果就已经balance小于0,那么就是错的,说明")" 在前面了,最后如果balance等于0,那么就是正确的。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def check(s):
balance=0
for i in s:
if i=='(':
balance+=1
else:
balance-=1
if balance<0:
return False
return balance==0
def dfs(t,n,result,allresult):
if t==n:
if check(result):
allresult.append(result[:])
return
dfs(t+1,n,result+'(',allresult)
dfs(t+1,n,result+')',allresult)
allresult=[]
dfs(0,n*2,'',allresult)
return allresult
通过维护一个left,right变量,过程中"("的数量要一直大于")"的数量,最后返回答案的时候二者数量要相等。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def dfs(left,right,n,result,allresult):
if right>left:return
if left==n and left==right:
allresult.append(''.join(result))
return
if left<n:
dfs(left+1,right,n,result+'(',allresult)
if right<n:
dfs(left,right+1,n,result+')',allresult)
allresult=[]
dfs(0,0,n,'',allresult)
return allresult
查看9道真题和解析