Skip to content

Commit 4991fee

Browse files
committed
feat: update solutions to lcci problem: No.08.09
No.08.09.Bracket
1 parent 82fc208 commit 4991fee

File tree

11 files changed

+273
-256
lines changed

11 files changed

+273
-256
lines changed

lcci/08.09.Bracket/README.md

+101-87
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,20 @@
2323

2424
## 解法
2525

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)$。
2740

2841
<!-- tabs:start -->
2942

@@ -34,17 +47,16 @@
3447
```python
3548
class Solution:
3649
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:
4154
ans.append(t)
4255
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 + ')')
4758

59+
ans = []
4860
dfs(0, 0, '')
4961
return ans
5062
```
@@ -55,46 +67,25 @@ class Solution:
5567

5668
```java
5769
class Solution {
70+
private List<String> ans = new ArrayList<>();
71+
private int n;
72+
5873
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, "");
6176
return ans;
6277
}
6378

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) {
6781
return;
6882
}
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;
7486
}
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 + ")");
9889
}
9990
}
10091
```
@@ -106,41 +97,41 @@ class Solution {
10697
public:
10798
vector<string> generateParenthesis(int n) {
10899
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, "");
110111
return ans;
111112
}
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-
}
121113
};
122114
```
123115
124116
### **Go**
125117
126118
```go
127119
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+")")
143132
}
133+
dfs(0, 0, "")
134+
return ans
144135
}
145136
```
146137

@@ -152,45 +143,68 @@ func dfs(left, right, n int, t string, ans *[]string) {
152143
* @return {string[]}
153144
*/
154145
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;
158160
};
161+
```
159162

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 + ')');
170177
}
178+
let ans = [];
179+
dfs(0, 0, '');
180+
return ans;
171181
}
172182
```
173183

174184
### **Rust**
175185

176186
```rust
177187
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>) {
179189
if left == 0 && right == 0 {
180-
res.push(t);
190+
res.push(s.clone());
181191
return;
182192
}
183193
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();
185197
}
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();
188202
}
189203
}
190204

191205
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);
194208
res
195209
}
196210
}

0 commit comments

Comments
 (0)