23
23
24
24
## 解法
25
25
26
- <!-- 这里可写通用的实现逻辑 -->
27
-
28
- 递归求解。其中,` left ` 表示剩余的 ` ( ` ,` right ` 表示剩余的 ` ) ` 。
29
-
30
- - 当 ` left ` > ` right ` 时,说明 state 中 ` ( ` 少于 ` ) ` ,不是合法组合,直接剪枝;
31
- - 当 ` right ` == 0 时,说明 state 组合完毕;
32
- - 当 ` left ` > 0 时,此时可往 state 添加一个 ` ( ` ;
33
- - 当 ` right ` > 0 时,此时可往 state 添加一个 ` ) ` 。
26
+ 深度优先搜索 DFS。
34
27
35
28
<!-- tabs:start -->
36
29
41
34
``` python
42
35
class Solution :
43
36
def generateParenthesis (self , n : int ) -> List[str ]:
44
- res = []
45
- def generate (state , left , right ):
46
- # 剩余的`(`多于`)`
47
- if left > right:
48
- return
49
- if right == 0 :
50
- res.append(state)
37
+ ans = []
38
+
39
+ def dfs (left , right , t ):
40
+ if left == n and right == n:
41
+ ans.append(t)
51
42
return
52
- if left > 0 :
53
- generate(state + ' (' , left - 1 , right)
54
- if right > 0 :
55
- generate(state + ' )' , left, right - 1 )
56
- generate(' ' , n, n)
57
- return res
43
+ if left < n:
44
+ dfs(left + 1 , right, t + ' (' )
45
+ if right < left:
46
+ dfs(left, right + 1 , t + ' )' )
47
+
48
+ dfs(0 , 0 , ' ' )
49
+ return ans
58
50
```
59
51
60
52
### ** Java**
@@ -63,29 +55,93 @@ class Solution:
63
55
64
56
``` java
65
57
class Solution {
66
- List<String > res;
67
-
68
58
public List<String > generateParenthesis (int n ) {
69
- res = new ArrayList<> ();
70
- generate( " " , n , n);
71
- return res ;
59
+ List< String > ans = new ArrayList<> ();
60
+ dfs( 0 , 0 , n, " " , ans );
61
+ return ans ;
72
62
}
73
63
74
- private void generate (String state , int left , int right ) {
75
- if (left > right) {
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);
76
67
return ;
77
68
}
78
- if (right == 0 ) {
79
- res. add(state);
80
- return ;
69
+ if (left < n) {
70
+ dfs(left + 1 , right, n, t + " (" , ans);
81
71
}
82
- if (left > 0 ) {
83
- generate(state + " ( " , left - 1 , right );
72
+ if (right < left ) {
73
+ dfs(left, right + 1 , n, t + " ) " , ans );
84
74
}
85
- if (right > 0 ) {
86
- generate(state + " )" , left, right - 1 );
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 );
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### ** C++**
103
+
104
+ ``` cpp
105
+ class Solution {
106
+ public:
107
+ vector<string > generateParenthesis(int n) {
108
+ vector<string > ans;
109
+ dfs(0, 0, n, "", ans);
110
+ return ans;
111
+ }
112
+
113
+ void dfs(int left, int right, int n, string t, vector<string>& ans) {
114
+ if (left == n && right == n)
115
+ {
116
+ ans.push_back(t);
117
+ return;
87
118
}
119
+ if (left < n) dfs(left + 1 , right, n, t + " (" , ans);
120
+ if (right < left) dfs(left, right + 1 , n, t + " )" , ans);
88
121
}
122
+ };
123
+ ```
124
+
125
+ ### ** Go**
126
+
127
+ ``` go
128
+ func generateParenthesis (n int ) []string {
129
+ var ans []string
130
+ dfs (0 , 0 , n, " " , &ans)
131
+ return ans
132
+ }
133
+
134
+ func dfs (left , right , n int , t string , ans *[]string ) {
135
+ if left == n && right == n {
136
+ *ans = append (*ans, t)
137
+ return
138
+ }
139
+ if left < n {
140
+ dfs (left+1 , right, n, t+" (" , ans)
141
+ }
142
+ if right < left {
143
+ dfs (left, right+1 , n, t+" )" , ans)
144
+ }
89
145
}
90
146
```
91
147
0 commit comments