原文引用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都不会用了。 所以偶尔还是得多练练手的。