版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/83041989
题目描述
给定n对括号,产生所有合法的括号组合
例子
给定n = 3
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解法
法1 - DFS
if (左右括号都已用完) {
加入解集,返回
}
//否则开始试各种选择
if (还有左括号可以用) {
加一个左括号,继续递归
}
if (右括号小于左括号) {
加一个右括号,继续递归
}
法2 - DP
考虑如下步骤:
1-pair ----- ()
在内部产生0-pair, 外部产生n-1 pair ----- ()(…)…
在内部产生1-pair, 外部产生n-2 pair ----- (())(…)…
…
在内部产生n-1 pair, 外部产生0-pair ----- ((…))
收获
- 任何递归解法都可以用非递归来解,本题的非递归采用DP的思想。
- 有效括号问题是一种比较典型题型,后续需要继续整理练习。
解法1
明确一点-左括号数≥右括号数
用left和right表示左/右括号剩余的数目
(截止条件) 可能存在left=0,right = 1 → 截止条件为right == 0
(主体) 初始时left=right=n, 此时优先添加左括号
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = []
self.dfs(n, n, '', res)
return res
def dfs(self, left, right, ss, res):
if right == 0:
res.append(ss)
return
if left:
self.dfs(left-1, right, ss + '(', res)
if right > left:
self.dfs(left, right-1, ss + ')', res)
解法2
DP-非递归。弄清楚产生括号的过程~
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
dp = [[] for _ in range(n+1)]
dp[0].append('')
for i in range(n+1):
for j in range(i): # 内部包含的括号数
dp[i] += ['(' + x + ')' + y for x in dp[j] for y in dp[i-j-1]]
return dp[-1]