给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
在真实的面试中遇到过这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
result =["()"]
temp=[]
for i in range(n-1):
for j in result:
for k in range(len(j)):
l=k
while l<len(j):
temp1=list(j)
temp1.insert(l,')')
temp1.insert(k,'(')
temp2="".join(temp1)
if temp2 not in temp:
temp.append(temp2)
l+=1
result=temp
temp=[]
return result
看到这道题第一想法是依次求出生成0对括号到n对括号的所有可能,即当我们要求i对括号的时候,我们遍历一下第i-1对括号的所有可能,考虑在其每种可能中插入一个新的括号来生成i对括号的的所有可能。刚开始插入的方式我们采取使用两个指针我们遍历所有可能的下标组合来实现插入。但是这种方法呢会导致重复,因为每次插入的都是一对括号。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n==0:
return []
dp=[None for _ in range(n + 1)]
dp[0]=['']
temp=[]
for i in range(1,n+1):
for j in range (i):
left=dp[j]
right=dp[i-j-1]
for m1 in left:
for n1 in right:
temp.append('('+n1+')'+m1)
dp[i]=temp
temp=[]
return dp[n]
第二种方法呢,实质上是对第一种方法的在插入方法上的改进,在求有i对括号生成的括号组合的时候其可分解为”(“+j对括号生成的括号组合其中一种+”)“+i-j+1对括号生成的括号组合其中一种
这样我们就解决了重复的问题
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
result =[]
temp=''
def dfs(temp,left,right):
if left==0 and right==0:
result .append(temp)
return
if left>right:
return
if left>0:
dfs(temp+"(",left-1,right)
if right>0:
dfs(temp+')',left,right-1)
dfs(temp,n,n)
return result
第三种方法,dfs,其内在逻辑为
1.当left and right都大于零时,说明该组合即可加”(“也可加”)“
2.如果left>right说明我们先加了”)“不符合题意直接return
3.排除了2,其他情况只要left>0就可加”(“,只要right>0就可加”)“
4.当我们的left and right都等于0时,说明所有的括号都加完了,我们只去要将这种组合的方式append到result中就可以了。