Skip to content

Commit 7c66acc

Browse files
aQuaaQua
aQua
authored and
aQua
committed
finish Problem 22
1 parent 364bc1c commit 7c66acc

File tree

2 files changed

+49
-19
lines changed

2 files changed

+49
-19
lines changed

Algorithms/0022.generate-parentheses/README.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,40 @@ For example, given n = 3, a solution set is:
1414
]
1515
```
1616
## 解题思路
17+
在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集
1718

19+
需要从两个方面去思考:1. 选择与限制;2.结束条件
1820

19-
## 总结
21+
对于这道题,在任何时刻,你都有两种选择:
22+
1. 加左括号。
23+
2. 加右括号。
2024

25+
同时有以下限制:
26+
1. 如果左括号已经用完了,则不能再加左括号了。
27+
2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。
2128

29+
结束条件是:
30+
1. 左右括号都已经用完。
31+
32+
结束后的正确性:
33+
左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集。
34+
35+
递归函数传入参数:
36+
限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。
37+
38+
当然你还需要知道当前局面substr和解集res。
39+
40+
因此,把上面的思路拼起来就是代码:
41+
```
42+
if (左右括号都已用完) {
43+
加入解集,返回
44+
}
45+
//否则开始试各种选择
46+
if (还有左括号可以用) {
47+
加一个左括号,继续递归
48+
}
49+
if (还有右括号可以用,且,右括号小于左括号) {
50+
加一个右括号,继续递归
51+
}
52+
```
53+
## 总结
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
package Problem0022
22

33
func generateParenthesis(n int) []string {
4-
if n == 0 {
5-
return []string{""}
6-
}
7-
if n == 1 {
8-
return []string{"()"}
9-
}
10-
11-
return gen(generateParenthesis(n - 1))
4+
res := []string{}
5+
gen(n, n, "", &res)
6+
return res
127
}
138

14-
func gen(strs []string) []string {
15-
res := make([]string, 0, len(strs)*3)
16-
for _, s := range strs {
17-
res = append(res, "("+s+")")
9+
func gen(left, right int, substr string, res *[]string) {
10+
// 成功找到一个解
11+
if left == 0 && right == 0 {
12+
*res = append(*res, substr)
13+
return
1814
}
19-
for i, s := range strs {
20-
res = append(res, s+"()")
21-
if i != len(strs)-1 {
22-
res = append(res, "()"+s)
23-
}
15+
16+
// 因为左括号不用担心匹配问题,只要还有左括号,就可以随便加。
17+
if left > 0 {
18+
gen(left-1, right, substr+"(", res)
2419
}
2520

26-
return res
21+
// 右括号只有在左括号剩余较少的前提下,才能加
22+
if right > 0 && left < right {
23+
gen(left, right-1, substr+")", res)
24+
}
2725
}

0 commit comments

Comments
 (0)