1
1
impl Solution {
2
2
pub fn generate_parenthesis ( n : i32 ) -> Vec < String > {
3
- /*
4
- Only add open parenthesis if open < n
5
- Only add closing parenthesis if close < open
6
- valid if open == close == n
7
- */
8
- let mut stack: Vec < u8 > = vec ! [ ] ;
3
+ // Using the function stack instead of an explicitly allocated Vec
9
4
let mut res: Vec < String > = vec ! [ ] ;
10
5
11
- fn backtrack (
12
- stack : & mut Vec < u8 > ,
13
- res : & mut Vec < String > ,
14
- open_n : i32 ,
15
- closed_n : i32 ,
16
- n : i32 ,
17
- ) {
18
- if open_n == closed_n && closed_n == n {
19
- res. push ( String :: from_utf8 ( stack. clone ( ) ) . unwrap ( ) ) ;
6
+ fn backtrack ( res : & mut Vec < String > , s : String , open : i32 , close : i32 ) {
7
+ if open == 0 && close == 0 {
8
+ res. push ( s) ;
20
9
return ;
21
10
}
22
-
23
- if open_n < n {
24
- stack. push ( b'(' ) ;
25
- backtrack ( stack, res, open_n + 1 , closed_n, n) ;
26
- stack. pop ( ) ;
27
- }
28
-
29
- if closed_n < open_n {
30
- stack. push ( b')' ) ;
31
- backtrack ( stack, res, open_n, closed_n + 1 , n) ;
32
- stack. pop ( ) ;
11
+ if open == close {
12
+ backtrack ( res, s. clone ( ) + "(" , open - 1 , close) ;
13
+ } else {
14
+ if open > 0 {
15
+ backtrack ( res, s. clone ( ) + "(" , open - 1 , close) ;
16
+ }
17
+ if close > 0 {
18
+ backtrack ( res, s. clone ( ) + ")" , open, close - 1 ) ;
19
+ }
33
20
}
34
21
}
35
- backtrack ( & mut stack, & mut res, 0 , 0 , n) ;
22
+
23
+ backtrack ( & mut res, String :: from ( "" ) , n, n) ;
36
24
res
37
25
}
38
- }
26
+ }
0 commit comments