DFS+回溯专题 - leetcode22. Generate Parentheses

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/83041989

22. Generate Parentheses

题目描述

给定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]

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/83041989