Skip to content

Commit 2e243a2

Browse files
committed
feat: add solutions to lc problem: No.2147
No.2147.Number of Ways to Divide a Long Corridor
1 parent 3804c17 commit 2e243a2

File tree

22 files changed

+479
-73
lines changed

22 files changed

+479
-73
lines changed

solution/0100-0199/0132.Palindrome Partitioning II/README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class Solution:
7171
if g[i][j]:
7272
ans = min(ans, dfs(j + 1) + (j < n - 1))
7373
return ans
74-
74+
7575
n = len(s)
7676
g = [[True] * n for _ in range(n)]
7777
for i in range(n - 1, -1, -1):
@@ -175,7 +175,6 @@ class Solution {
175175

176176
### **Go**
177177

178-
179178
```go
180179
func minCut(s string) int {
181180
n := len(s)

solution/0100-0199/0132.Palindrome Partitioning II/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class Solution:
5757
if g[i][j]:
5858
ans = min(ans, dfs(j + 1) + (j < n - 1))
5959
return ans
60-
60+
6161
n = len(s)
6262
g = [[True] * n for _ in range(n)]
6363
for i in range(n - 1, -1, -1):

solution/1600-1699/1674.Minimum Moves to Make Array Complementary/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def minMoves(self, nums: List[int], limit: int) -> int:
1616
d[a + b + 1] += 1
1717

1818
ans, s = n, 0
19-
for v in d[2: limit * 2 + 1]:
19+
for v in d[2 : limit * 2 + 1]:
2020
s += v
2121
if ans > s:
2222
ans = s

solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README.md

+138-3
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,162 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:记忆化搜索**
64+
65+
设计函数 `dfs(i, cnt)` 表示从下标 `i` 开始,且当前已经分配了 `cnt` 个座位的方案数。
66+
67+
对于下标 `i` 处的字符,如果是 `S`,那么 `cnt``1`,如果此时 `cnt` 超过 `2`,那么直接返回 `0`
68+
69+
否则我们可以选择不放置屏风,此时的方案数为 `dfs(i + 1, cnt)`;如果此时 `cnt``2`,我们还可以选择放置屏风,此时的方案数为 `dfs(i + 1, 0)`
70+
71+
最终返回方案数,记忆化搜索即可。
72+
73+
时间复杂度 $O(n\times 3)$,空间复杂度 $O(n\times 3)$。其中 $n$ 为字符串 `corridor` 的长度。
74+
6375
<!-- tabs:start -->
6476

6577
### **Python3**
6678

6779
<!-- 这里可写当前语言的特殊实现逻辑 -->
6880

6981
```python
70-
82+
class Solution:
83+
def numberOfWays(self, corridor: str) -> int:
84+
@cache
85+
def dfs(i, cnt):
86+
if i == n:
87+
return int(cnt == 2)
88+
cnt += corridor[i] == 'S'
89+
if cnt > 2:
90+
return 0
91+
ans = dfs(i + 1, cnt)
92+
if cnt == 2:
93+
ans += dfs(i + 1, 0)
94+
ans %= mod
95+
return ans
96+
97+
n = len(corridor)
98+
mod = 10**9 + 7
99+
ans = dfs(0, 0)
100+
dfs.cache_clear()
101+
return ans
71102
```
72103

73104
### **Java**
74105

75106
<!-- 这里可写当前语言的特殊实现逻辑 -->
76107

77108
```java
109+
class Solution {
110+
private String s;
111+
private int n;
112+
private int[][] f;
113+
private static final int MOD = (int) 1e9 + 7;
114+
115+
public int numberOfWays(String corridor) {
116+
s = corridor;
117+
n = s.length();
118+
f = new int[n][3];
119+
for (var e : f) {
120+
Arrays.fill(e, -1);
121+
}
122+
return dfs(0, 0);
123+
}
124+
125+
private int dfs(int i, int cnt) {
126+
if (i == n) {
127+
return cnt == 2 ? 1 : 0;
128+
}
129+
cnt += s.charAt(i) == 'S' ? 1 : 0;
130+
if (cnt > 2) {
131+
return 0;
132+
}
133+
if (f[i][cnt] != -1) {
134+
return f[i][cnt];
135+
}
136+
int ans = dfs(i + 1, cnt);
137+
if (cnt == 2) {
138+
ans += dfs(i + 1, 0);
139+
ans %= MOD;
140+
}
141+
f[i][cnt] = ans;
142+
return ans;
143+
}
144+
}
145+
```
78146

147+
### **C++**
148+
149+
```cpp
150+
class Solution {
151+
public:
152+
const int mod = 1e9 + 7;
153+
154+
int numberOfWays(string corridor) {
155+
int n = corridor.size();
156+
vector<vector<int>> f(n, vector<int>(3, -1));
157+
function<int(int, int)> dfs;
158+
dfs = [&](int i, int cnt) {
159+
if (i == n) return cnt == 2 ? 1 : 0;
160+
cnt += corridor[i] == 'S';
161+
if (cnt > 2) return 0;
162+
if (f[i][cnt] != -1) return f[i][cnt];
163+
int ans = dfs(i + 1, cnt);
164+
if (cnt == 2) {
165+
ans += dfs(i + 1, 0);
166+
ans %= mod;
167+
}
168+
f[i][cnt] = ans;
169+
return ans;
170+
};
171+
return dfs(0, 0);
172+
}
173+
};
79174
```
80175

81-
### **TypeScript**
176+
### **Go**
177+
178+
```go
179+
func numberOfWays(corridor string) int {
180+
n := len(corridor)
181+
var mod int = 1e9 + 7
182+
f := make([][]int, n)
183+
for i := range f {
184+
f[i] = make([]int, 3)
185+
for j := range f[i] {
186+
f[i][j] = -1
187+
}
188+
}
189+
var dfs func(i, cnt int) int
190+
dfs = func(i, cnt int) int {
191+
if i == n {
192+
if cnt == 2 {
193+
return 1
194+
}
195+
return 0
196+
}
197+
if corridor[i] == 'S' {
198+
cnt++
199+
}
200+
if cnt > 2 {
201+
return 0
202+
}
203+
if f[i][cnt] != -1 {
204+
return f[i][cnt]
205+
}
206+
ans := dfs(i+1, cnt)
207+
if cnt == 2 {
208+
ans += dfs(i+1, 0)
209+
ans %= mod
210+
}
211+
f[i][cnt] = ans
212+
return ans
213+
}
214+
return dfs(0, 0)
215+
}
216+
```
82217

83-
<!-- 这里可写当前语言的特殊实现逻辑 -->
218+
### **TypeScript**
84219

85220
```ts
86221

solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README_EN.md

+126-1
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,138 @@ Installing any would create some section that does not have exactly two seats.
5656
### **Python3**
5757

5858
```python
59-
59+
class Solution:
60+
def numberOfWays(self, corridor: str) -> int:
61+
@cache
62+
def dfs(i, cnt):
63+
if i == n:
64+
return int(cnt == 2)
65+
cnt += corridor[i] == 'S'
66+
if cnt > 2:
67+
return 0
68+
ans = dfs(i + 1, cnt)
69+
if cnt == 2:
70+
ans += dfs(i + 1, 0)
71+
ans %= mod
72+
return ans
73+
74+
n = len(corridor)
75+
mod = 10**9 + 7
76+
ans = dfs(0, 0)
77+
dfs.cache_clear()
78+
return ans
6079
```
6180

6281
### **Java**
6382

6483
```java
84+
class Solution {
85+
private String s;
86+
private int n;
87+
private int[][] f;
88+
private static final int MOD = (int) 1e9 + 7;
89+
90+
public int numberOfWays(String corridor) {
91+
s = corridor;
92+
n = s.length();
93+
f = new int[n][3];
94+
for (var e : f) {
95+
Arrays.fill(e, -1);
96+
}
97+
return dfs(0, 0);
98+
}
99+
100+
private int dfs(int i, int cnt) {
101+
if (i == n) {
102+
return cnt == 2 ? 1 : 0;
103+
}
104+
cnt += s.charAt(i) == 'S' ? 1 : 0;
105+
if (cnt > 2) {
106+
return 0;
107+
}
108+
if (f[i][cnt] != -1) {
109+
return f[i][cnt];
110+
}
111+
int ans = dfs(i + 1, cnt);
112+
if (cnt == 2) {
113+
ans += dfs(i + 1, 0);
114+
ans %= MOD;
115+
}
116+
f[i][cnt] = ans;
117+
return ans;
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
const int mod = 1e9 + 7;
128+
129+
int numberOfWays(string corridor) {
130+
int n = corridor.size();
131+
vector<vector<int>> f(n, vector<int>(3, -1));
132+
function<int(int, int)> dfs;
133+
dfs = [&](int i, int cnt) {
134+
if (i == n) return cnt == 2 ? 1 : 0;
135+
cnt += corridor[i] == 'S';
136+
if (cnt > 2) return 0;
137+
if (f[i][cnt] != -1) return f[i][cnt];
138+
int ans = dfs(i + 1, cnt);
139+
if (cnt == 2) {
140+
ans += dfs(i + 1, 0);
141+
ans %= mod;
142+
}
143+
f[i][cnt] = ans;
144+
return ans;
145+
};
146+
return dfs(0, 0);
147+
}
148+
};
149+
```
65150

151+
### **Go**
152+
153+
```go
154+
func numberOfWays(corridor string) int {
155+
n := len(corridor)
156+
var mod int = 1e9 + 7
157+
f := make([][]int, n)
158+
for i := range f {
159+
f[i] = make([]int, 3)
160+
for j := range f[i] {
161+
f[i][j] = -1
162+
}
163+
}
164+
var dfs func(i, cnt int) int
165+
dfs = func(i, cnt int) int {
166+
if i == n {
167+
if cnt == 2 {
168+
return 1
169+
}
170+
return 0
171+
}
172+
if corridor[i] == 'S' {
173+
cnt++
174+
}
175+
if cnt > 2 {
176+
return 0
177+
}
178+
if f[i][cnt] != -1 {
179+
return f[i][cnt]
180+
}
181+
ans := dfs(i+1, cnt)
182+
if cnt == 2 {
183+
ans += dfs(i+1, 0)
184+
ans %= mod
185+
}
186+
f[i][cnt] = ans
187+
return ans
188+
}
189+
return dfs(0, 0)
190+
}
66191
```
67192

68193
### **TypeScript**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
const int mod = 1e9 + 7;
4+
5+
int numberOfWays(string corridor) {
6+
int n = corridor.size();
7+
vector<vector<int>> f(n, vector<int>(3, -1));
8+
function<int(int, int)> dfs;
9+
dfs = [&](int i, int cnt) {
10+
if (i == n) return cnt == 2 ? 1 : 0;
11+
cnt += corridor[i] == 'S';
12+
if (cnt > 2) return 0;
13+
if (f[i][cnt] != -1) return f[i][cnt];
14+
int ans = dfs(i + 1, cnt);
15+
if (cnt == 2) {
16+
ans += dfs(i + 1, 0);
17+
ans %= mod;
18+
}
19+
f[i][cnt] = ans;
20+
return ans;
21+
};
22+
return dfs(0, 0);
23+
}
24+
};

0 commit comments

Comments
 (0)