LeetCode #22

半腔热情 提交于 2019-11-28 12:56:37

原文引用https://www.dazhuanlan.com/2019/08/25/5d6223ed80689/


最近重新开始了在刷题,也尽量多写一写吧。

指定有N对括号,需要输出所有可能的、形式上正确的括号组合情况。例如N=3时,有

[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]

这五种可能的排列。

二、解题思路:

主要参考两篇文章:

https://leetcode.com/problems/generate-parentheses/solution/

https://blog.csdn.net/runningtortoises/article/details/45625363

分别有这么几种思路:

1、暴力破解

把所有可能的串都输出来,然后逐个判断合法性。

2、回溯

3、Closure Number

这种思路是我最为喜欢的一种。我们可以发现,一个合法的串总是可以递归的表示为:

两个合法的子串以及一对括号。

想到这一点之后,其实后面的思路很自然的也能想通了: 两个子串的括号对数为N-1,我们只需要遍历所有可能的组合情况就行了,从(0, N-1), (1, N-2), …, (N-1, 0)。 这种思路实际上是按顺序生成 0, 1, …, N 的所有解。

4、增量

不断的判断左右括号的数量,进而选择添加左括号还是添加右括号。

三、具体实现:

这里就只贴第二种思路的吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution(object):
    """
    递归版
    """
    def generateParenthesis(self, N):
        if N == 0: return ['']
        ans = []
        for c in xrange(N):
            for left in self.generateParenthesis(c):
                for right in self.generateParenthesis(N-1-c):
                    ans.append('({}){}'.format(left, right))
        return ans

class Solution(object):
    """
    非递归版
    """
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        if n==0: return ['']
        res_dict = {0:['']}
        for i in range(1, n+1):
            tmp_res = []
            for left_count in range(1, i+1):
                for left in res_dict[left_count-1]:
                    for right in res_dict[i-left_count]:
                        tmp_res.append('({}){}'.format(left, right))
            res_dict[i] = tmp_res
        return res_dict[n]

四、其他

python的好处在于,代码可以相当精简。同样的算法在c里面去实现的话,难度往往会大很多。 python用久了之后,会发现自己“变笨了”,差不多连c都不会用了。 所以偶尔还是得多练练手的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!