代码仓库:Github | Leetcode solutions @doubleZ0108 from Peking University.
- 解法1(超时):看数据规模不大,本来想暴力解。首先将n个
(
和n个)
加入到数组中,然后调用库函数itertools.permutations()
进行全排列,并通过集合set()去重,最后再依次判断每个可能的组合是否合法,可以根据20题的算法用栈来判断括号是否匹配 - 解法2(T60% S90%):又是经典的深搜(携带参数递归),递归参数设定为
cur
代表当前做到的下标位置,li
代表这一种情况的括号组成,还有两个参数leftCount
和rightCount
代表当前位置之前左右括号的数量。- 初始:
cur=1
(因为第一个必须是(
),li
的首元素是(
其余为空,leftCount=1
,rightCount=0
- 终止条件:如果
leftCount
或rightCount
大于n则直接返回,当前解不可能(事实上只判断leftCount
就好,rightCount
不可能大于n);如果cur
指到最后位置2n了就可以将当前li转换为字符串加入结果中了 - 递归:如果
leftCount>rightCount
,代表之前肯定有一个(
,则可以把当前位置放一个)
并递归;否则当前位置只能放(
再递归
- 初始:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = []
def gen(cur, li, leftCount, rightCount):
if leftCount>n: return
if cur == 2*n:
res.append("".join(li))
return
if leftCount > rightCount:
li[cur] = ')'
gen(cur+1, li, leftCount, rightCount+1)
li[cur] = '('
gen(cur+1, li, leftCount+1, rightCount)
li = ['' for _ in range(2*n)]
li[0] = '('
gen(1, li, 1, 0)
return res
def otherSolution(self, n):
# 解法1 超时
def isValid(item):
stack = []
for s in item:
if s == '(': stack.append(s)
else:
if len(stack)<=0: return False
if stack.pop() != '(': return False
return stack==[]
li = []
for i in range(n):
li.append('(')
li.append(')')
from itertools import permutations
li = list(set(permutations(li)))
res = []
for item in li:
if isValid(item): res.append("".join(item))
return res