22.Generate Parentheses(递归)
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
Solution1:(TLE)
import itertools
class Solution:
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
def judge(s):
count = 0
for i in s:
if i=='(':
count += 1
if i==')':
count -= 1
if count<0:
return False
return True
s = '()'*n
res = set()
for i in itertools.permutations(s,2*n):
temp = ''.join(i)
if judge(temp):
res.add(temp)
return list(res)
生成所有全排列,逐个判断是否合理。然后在n=5的时候就炸了。
Solution2:
class Solution:
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
def judge(s):
count = 0
for i in s:
if i=='(':
count += 1
if i==')':
count -= 1
if count<0:
return False
if count ==0:
return True
else:
return False
res = []
def generate(A = []):
if len(A)==n+n:
temp = ''.join(A)
if judge(temp):
res.append(temp)
else:
A.append('(')
generate(A)
A.pop()
A.append(')')
generate(A)
A.pop()
generate()
return res
同样是生成所有全排列,但是这里思路是分别在每个位置上放‘(’ 和')',减少了很多的搜索空间。这种递归生成的方式值得注意。
Solution3:
class Solution:
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
def judge(s):
count = 0
for i in s:
if i=='(':
count += 1
if i==')':
count -= 1
if count<0:
return False
if count ==0:
return True
else:
return False
res = []
def generate(num):
temp = '0'*(2*n-len(str(num))) + str(num)
s = ''
for i in temp:
if i=='0':
s += '('
else:
s += ')'
return s
for i in range(2**(2*n)):
t = generate(bin(i).split('b')[-1])
if judge(t):
res.append(t)
return res
思路同solution2,思路是每个位置都有两个候选,那么可以用一个二进制数去标记它。所有的空间也就是在2的2n次方的这个范围里。
Solution4:
class Solution:
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = []
def generate(a,left,right):
if len(a)==2*n:
res.append(''.join(a))
return
if left<n:
generate(a+'(',left+1,right)
if right<left:
generate(a+')',left,right+1)
generate('',0,0)
return res
回溯。不是先生成所有组合,而是用递归回溯的方法生成所有合法的组合。
已知左括号先出现,且个数为0~n,因此先对左括号进行递归到底,条件为left < n(用left记录左括号数)。然后对右括号递归,条件为右括号数(用right记录)比左括号数少,即right < left。
递归出口为生成的串A长度增长到2n时。
参考:https://blog.csdn.net/u012033124/article/details/80532460