Skip to content

Commit f47e239

Browse files
authored
feat: add rust solution to lc problem: No.2147 (#4900)
1 parent a683485 commit f47e239

File tree

4 files changed

+221
-0
lines changed

4 files changed

+221
-0
lines changed

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,54 @@ function numberOfWays(corridor: string): number {
254254
}
255255
```
256256

257+
#### Rust
258+
259+
```rust
260+
impl Solution {
261+
pub fn number_of_ways(corridor: String) -> i32 {
262+
let n: usize = corridor.len();
263+
let bytes = corridor.as_bytes();
264+
let modv: i32 = 1_000_000_007;
265+
266+
let mut f = vec![vec![-1; 3]; n];
267+
268+
fn dfs(
269+
i: usize,
270+
k: usize,
271+
n: usize,
272+
bytes: &[u8],
273+
f: &mut Vec<Vec<i32>>,
274+
modv: i32,
275+
) -> i32 {
276+
if i >= n {
277+
return if k == 2 { 1 } else { 0 };
278+
}
279+
if f[i][k] != -1 {
280+
return f[i][k];
281+
}
282+
283+
let mut nk = k;
284+
if bytes[i] == b'S' {
285+
nk += 1;
286+
}
287+
if nk > 2 {
288+
return 0;
289+
}
290+
291+
let mut res = dfs(i + 1, nk, n, bytes, f, modv);
292+
if nk == 2 {
293+
res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv;
294+
}
295+
296+
f[i][k] = res;
297+
res
298+
}
299+
300+
dfs(0, 0, n, bytes, &mut f, modv)
301+
}
302+
}
303+
```
304+
257305
<!-- tabs:end -->
258306

259307
<!-- solution:end -->
@@ -373,6 +421,35 @@ function numberOfWays(corridor: string): number {
373421
}
374422
```
375423

424+
#### Rust
425+
426+
```rust
427+
impl Solution {
428+
pub fn number_of_ways(corridor: String) -> i32 {
429+
let modv: i64 = 1_000_000_007;
430+
let mut ans: i64 = 1;
431+
let mut cnt: i64 = 0;
432+
let mut last: i64 = 0;
433+
434+
for (i, ch) in corridor.chars().enumerate() {
435+
if ch == 'S' {
436+
cnt += 1;
437+
if cnt > 2 && cnt % 2 == 1 {
438+
ans = ans * (i as i64 - last) % modv;
439+
}
440+
last = i as i64;
441+
}
442+
}
443+
444+
if cnt > 0 && cnt % 2 == 0 {
445+
ans as i32
446+
} else {
447+
0
448+
}
449+
}
450+
}
451+
```
452+
376453
<!-- tabs:end -->
377454

378455
<!-- solution:end -->

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,54 @@ function numberOfWays(corridor: string): number {
249249
}
250250
```
251251

252+
#### Rust
253+
254+
```rust
255+
impl Solution {
256+
pub fn number_of_ways(corridor: String) -> i32 {
257+
let n: usize = corridor.len();
258+
let bytes = corridor.as_bytes();
259+
let modv: i32 = 1_000_000_007;
260+
261+
let mut f = vec![vec![-1; 3]; n];
262+
263+
fn dfs(
264+
i: usize,
265+
k: usize,
266+
n: usize,
267+
bytes: &[u8],
268+
f: &mut Vec<Vec<i32>>,
269+
modv: i32,
270+
) -> i32 {
271+
if i >= n {
272+
return if k == 2 { 1 } else { 0 };
273+
}
274+
if f[i][k] != -1 {
275+
return f[i][k];
276+
}
277+
278+
let mut nk = k;
279+
if bytes[i] == b'S' {
280+
nk += 1;
281+
}
282+
if nk > 2 {
283+
return 0;
284+
}
285+
286+
let mut res = dfs(i + 1, nk, n, bytes, f, modv);
287+
if nk == 2 {
288+
res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv;
289+
}
290+
291+
f[i][k] = res;
292+
res
293+
}
294+
295+
dfs(0, 0, n, bytes, &mut f, modv)
296+
}
297+
}
298+
```
299+
252300
<!-- tabs:end -->
253301

254302
<!-- solution:end -->
@@ -368,6 +416,35 @@ function numberOfWays(corridor: string): number {
368416
}
369417
```
370418

419+
#### Rust
420+
421+
```rust
422+
impl Solution {
423+
pub fn number_of_ways(corridor: String) -> i32 {
424+
let modv: i64 = 1_000_000_007;
425+
let mut ans: i64 = 1;
426+
let mut cnt: i64 = 0;
427+
let mut last: i64 = 0;
428+
429+
for (i, ch) in corridor.chars().enumerate() {
430+
if ch == 'S' {
431+
cnt += 1;
432+
if cnt > 2 && cnt % 2 == 1 {
433+
ans = ans * (i as i64 - last) % modv;
434+
}
435+
last = i as i64;
436+
}
437+
}
438+
439+
if cnt > 0 && cnt % 2 == 0 {
440+
ans as i32
441+
} else {
442+
0
443+
}
444+
}
445+
}
446+
```
447+
371448
<!-- tabs:end -->
372449

373450
<!-- solution:end -->
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
impl Solution {
2+
pub fn number_of_ways(corridor: String) -> i32 {
3+
let n: usize = corridor.len();
4+
let bytes = corridor.as_bytes();
5+
let modv: i32 = 1_000_000_007;
6+
7+
let mut f = vec![vec![-1; 3]; n];
8+
9+
fn dfs(
10+
i: usize,
11+
k: usize,
12+
n: usize,
13+
bytes: &[u8],
14+
f: &mut Vec<Vec<i32>>,
15+
modv: i32,
16+
) -> i32 {
17+
if i >= n {
18+
return if k == 2 { 1 } else { 0 };
19+
}
20+
if f[i][k] != -1 {
21+
return f[i][k];
22+
}
23+
24+
let mut nk = k;
25+
if bytes[i] == b'S' {
26+
nk += 1;
27+
}
28+
if nk > 2 {
29+
return 0;
30+
}
31+
32+
let mut res = dfs(i + 1, nk, n, bytes, f, modv);
33+
if nk == 2 {
34+
res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv;
35+
}
36+
37+
f[i][k] = res;
38+
res
39+
}
40+
41+
dfs(0, 0, n, bytes, &mut f, modv)
42+
}
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
impl Solution {
2+
pub fn number_of_ways(corridor: String) -> i32 {
3+
let modv: i64 = 1_000_000_007;
4+
let mut ans: i64 = 1;
5+
let mut cnt: i64 = 0;
6+
let mut last: i64 = 0;
7+
8+
for (i, ch) in corridor.chars().enumerate() {
9+
if ch == 'S' {
10+
cnt += 1;
11+
if cnt > 2 && cnt % 2 == 1 {
12+
ans = ans * (i as i64 - last) % modv;
13+
}
14+
last = i as i64;
15+
}
16+
}
17+
18+
if cnt > 0 && cnt % 2 == 0 {
19+
ans as i32
20+
} else {
21+
0
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)