23
23
24
24
## 解法
25
25
26
- 深度优先搜索 DFS。
26
+ <!-- 这里可写通用的实现逻辑 -->
27
+
28
+ ** 方法一:DFS + 剪枝**
29
+
30
+ 题目中 $n$ 的范围为 $[ 1, 8] $,因此我们直接通过“暴力搜索 + 剪枝”的方式快速解决本题。
31
+
32
+ 我们设计函数 ` dfs(l, r, t) ` ,其中 $l$ 和 $r$ 分别表示左括号和右括号的数量,而 $t$ 表示当前的括号序列。那么我们可以得到如下的递归结构:
33
+
34
+ - 如果 $l \gt n$ 或者 $r \gt n$ 或者 $l \lt r$,那么当前括号组合 $t$ 不合法,直接返回;
35
+ - 如果 $l = n$ 且 $r = n$,那么当前括号组合 $t$ 合法,将其加入答案数组 ` ans ` 中,直接返回;
36
+ - 我们可以选择添加一个左括号,递归执行 ` dfs(l + 1, r, t + "(") ` ;
37
+ - 我们也可以选择添加一个右括号,递归执行 ` dfs(l, r + 1, t + ")") ` 。
38
+
39
+ 时间复杂度 $O(2^{n\times 2} \times n)$,空间复杂度 $O(n)$。
27
40
28
41
<!-- tabs:start -->
29
42
34
47
``` python
35
48
class Solution :
36
49
def generateParenthesis (self , n : int ) -> List[str ]:
37
- ans = []
38
-
39
- def dfs ( left , right , t ):
40
- if left == n and right == n:
50
+ def dfs ( l , r , t ):
51
+ if l > n or r > n or l < r:
52
+ return
53
+ if l == n and r == n:
41
54
ans.append(t)
42
55
return
43
- if left < n:
44
- dfs(left + 1 , right, t + ' (' )
45
- if right < left:
46
- dfs(left, right + 1 , t + ' )' )
56
+ dfs(l + 1 , r, t + ' (' )
57
+ dfs(l, r + 1 , t + ' )' )
47
58
59
+ ans = []
48
60
dfs(0 , 0 , ' ' )
49
61
return ans
50
62
```
@@ -55,46 +67,25 @@ class Solution:
55
67
56
68
``` java
57
69
class Solution {
70
+ private List<String > ans = new ArrayList<> ();
71
+ private int n;
72
+
58
73
public List<String > generateParenthesis (int n ) {
59
- List< String > ans = new ArrayList<> () ;
60
- dfs(0 , 0 , n, " " , ans );
74
+ this . n = n ;
75
+ dfs(0 , 0 , " " );
61
76
return ans;
62
77
}
63
78
64
- private void dfs (int left , int right , int n , String t , List<String > ans ) {
65
- if (left == n && right == n) {
66
- ans. add(t);
79
+ private void dfs (int l , int r , String t ) {
80
+ if (l > n || r > n || l < r) {
67
81
return ;
68
82
}
69
- if (left < n) {
70
- dfs(left + 1 , right, n, t + " (" , ans);
71
- }
72
- if (right < left) {
73
- dfs(left, right + 1 , n, t + " )" , ans);
83
+ if (l == n && r == n) {
84
+ ans. add(t);
85
+ return ;
74
86
}
75
- }
76
- }
77
- ```
78
-
79
- ### ** TypeScript**
80
-
81
- ``` ts
82
- function generateParenthesis(n : number ): string [] {
83
- let ans = [];
84
- dfs (0 , 0 , n , ' ' , ans );
85
- return ans ;
86
- }
87
-
88
- function dfs(left : number , right : number , n : number , t : string , ans : string []) {
89
- if (left == n && right == n ) {
90
- ans .push (t );
91
- return ;
92
- }
93
- if (left < n ) {
94
- dfs (left + 1 , right , n , t + ' (' , ans );
95
- }
96
- if (right < left ) {
97
- dfs (left , right + 1 , n , t + ' )' , ans );
87
+ dfs(l + 1 , r, t + " (" );
88
+ dfs(l, r + 1 , t + " )" );
98
89
}
99
90
}
100
91
```
@@ -106,41 +97,41 @@ class Solution {
106
97
public:
107
98
vector<string > generateParenthesis(int n) {
108
99
vector<string > ans;
109
- dfs(0, 0, n, "", ans);
100
+ function<void(int, int, string)> dfs;
101
+ dfs = [ &] (int l, int r, string t) {
102
+ if (l > n || r > n || l < r) return;
103
+ if (l == n && r == n) {
104
+ ans.push_back(t);
105
+ return;
106
+ }
107
+ dfs(l + 1, r, t + "(");
108
+ dfs(l, r + 1, t + ")");
109
+ };
110
+ dfs(0, 0, "");
110
111
return ans;
111
112
}
112
-
113
- void dfs(int left, int right, int n, string t, vector<string>& ans) {
114
- if (left == n && right == n) {
115
- ans.push_back(t);
116
- return;
117
- }
118
- if (left < n) dfs(left + 1 , right, n, t + " (" , ans);
119
- if (right < left) dfs(left, right + 1 , n, t + " )" , ans);
120
- }
121
113
};
122
114
```
123
115
124
116
### **Go**
125
117
126
118
```go
127
119
func generateParenthesis(n int) []string {
128
- var ans []string
129
- dfs (0 , 0 , n, " " , &ans)
130
- return ans
131
- }
132
-
133
- func dfs (left , right , n int , t string , ans *[]string ) {
134
- if left == n && right == n {
135
- *ans = append (*ans, t)
136
- return
137
- }
138
- if left < n {
139
- dfs (left+1 , right, n, t+" (" , ans)
140
- }
141
- if right < left {
142
- dfs (left, right+1 , n, t+" )" , ans)
120
+ ans := []string{}
121
+ var dfs func(int, int, string)
122
+ dfs = func(l, r int, t string) {
123
+ if l > n || r > n || l < r {
124
+ return
125
+ }
126
+ if l == n && r == n {
127
+ ans = append(ans, t)
128
+ return
129
+ }
130
+ dfs(l+1, r, t+"(")
131
+ dfs(l, r+1, t+")")
143
132
}
133
+ dfs(0, 0, "")
134
+ return ans
144
135
}
145
136
```
146
137
@@ -152,45 +143,68 @@ func dfs(left, right, n int, t string, ans *[]string) {
152
143
* @return {string[]}
153
144
*/
154
145
var generateParenthesis = function (n ) {
155
- let res = [];
156
- dfs (n, 0 , 0 , ' ' , res);
157
- return res;
146
+ function dfs (l , r , t ) {
147
+ if (l > n || r > n || l < r) {
148
+ return ;
149
+ }
150
+ if (l == n && r == n) {
151
+ ans .push (t);
152
+ return ;
153
+ }
154
+ dfs (l + 1 , r, t + ' (' );
155
+ dfs (l, r + 1 , t + ' )' );
156
+ }
157
+ let ans = [];
158
+ dfs (0 , 0 , ' ' );
159
+ return ans;
158
160
};
161
+ ```
159
162
160
- function dfs (n , left , right , prev , res ) {
161
- if (left == n && right == n) {
162
- res .push (prev);
163
- return ;
164
- }
165
- if (left < n) {
166
- dfs (n, left + 1 , right, prev + ' (' , res);
167
- }
168
- if (right < left) {
169
- dfs (n, left, right + 1 , prev + ' )' , res);
163
+ ### ** TypeScript**
164
+
165
+ ``` ts
166
+ function generateParenthesis(n : number ): string [] {
167
+ function dfs(l , r , t ) {
168
+ if (l > n || r > n || l < r ) {
169
+ return ;
170
+ }
171
+ if (l == n && r == n ) {
172
+ ans .push (t );
173
+ return ;
174
+ }
175
+ dfs (l + 1 , r , t + ' (' );
176
+ dfs (l , r + 1 , t + ' )' );
170
177
}
178
+ let ans = [];
179
+ dfs (0 , 0 , ' ' );
180
+ return ans ;
171
181
}
172
182
```
173
183
174
184
### ** Rust**
175
185
176
186
``` rust
177
187
impl Solution {
178
- fn dfs (left : i32 , right : i32 , t : String , res : & mut Vec <String >) {
188
+ fn dfs (left : i32 , right : i32 , s : & mut String , res : & mut Vec <String >) {
179
189
if left == 0 && right == 0 {
180
- res . push (t );
190
+ res . push (s . clone () );
181
191
return ;
182
192
}
183
193
if left > 0 {
184
- Self :: dfs (left - 1 , right , format! (" {}(" , t ), res );
194
+ s . push ('(' );
195
+ Self :: dfs (left - 1 , right , s , res );
196
+ s . pop ();
185
197
}
186
- if left < right {
187
- Self :: dfs (left , right - 1 , format! (" {})" , t ), res );
198
+ if right > left {
199
+ s . push (')' );
200
+ Self :: dfs (left , right - 1 , s , res );
201
+ s . pop ();
188
202
}
189
203
}
190
204
191
205
pub fn generate_parenthesis (n : i32 ) -> Vec <String > {
192
- let mut res = vec! [] ;
193
- Self :: dfs (n , n , String :: new (), & mut res );
206
+ let mut res = Vec :: new () ;
207
+ Self :: dfs (n , n , & mut String :: new (), & mut res );
194
208
res
195
209
}
196
210
}
0 commit comments