diff --git a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README.md b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README.md index 65bcd84fb5f08..de34e30cd1cec 100644 --- a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README.md +++ b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README.md @@ -254,6 +254,54 @@ function numberOfWays(corridor: string): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let n: usize = corridor.len(); + let bytes = corridor.as_bytes(); + let modv: i32 = 1_000_000_007; + + let mut f = vec![vec![-1; 3]; n]; + + fn dfs( + i: usize, + k: usize, + n: usize, + bytes: &[u8], + f: &mut Vec>, + modv: i32, + ) -> i32 { + if i >= n { + return if k == 2 { 1 } else { 0 }; + } + if f[i][k] != -1 { + return f[i][k]; + } + + let mut nk = k; + if bytes[i] == b'S' { + nk += 1; + } + if nk > 2 { + return 0; + } + + let mut res = dfs(i + 1, nk, n, bytes, f, modv); + if nk == 2 { + res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv; + } + + f[i][k] = res; + res + } + + dfs(0, 0, n, bytes, &mut f, modv) + } +} +``` + @@ -373,6 +421,35 @@ function numberOfWays(corridor: string): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let modv: i64 = 1_000_000_007; + let mut ans: i64 = 1; + let mut cnt: i64 = 0; + let mut last: i64 = 0; + + for (i, ch) in corridor.chars().enumerate() { + if ch == 'S' { + cnt += 1; + if cnt > 2 && cnt % 2 == 1 { + ans = ans * (i as i64 - last) % modv; + } + last = i as i64; + } + } + + if cnt > 0 && cnt % 2 == 0 { + ans as i32 + } else { + 0 + } + } +} +``` + diff --git a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README_EN.md b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README_EN.md index e30764427f6e3..9649d0580160f 100644 --- a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README_EN.md +++ b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/README_EN.md @@ -249,6 +249,54 @@ function numberOfWays(corridor: string): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let n: usize = corridor.len(); + let bytes = corridor.as_bytes(); + let modv: i32 = 1_000_000_007; + + let mut f = vec![vec![-1; 3]; n]; + + fn dfs( + i: usize, + k: usize, + n: usize, + bytes: &[u8], + f: &mut Vec>, + modv: i32, + ) -> i32 { + if i >= n { + return if k == 2 { 1 } else { 0 }; + } + if f[i][k] != -1 { + return f[i][k]; + } + + let mut nk = k; + if bytes[i] == b'S' { + nk += 1; + } + if nk > 2 { + return 0; + } + + let mut res = dfs(i + 1, nk, n, bytes, f, modv); + if nk == 2 { + res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv; + } + + f[i][k] = res; + res + } + + dfs(0, 0, n, bytes, &mut f, modv) + } +} +``` + @@ -368,6 +416,35 @@ function numberOfWays(corridor: string): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let modv: i64 = 1_000_000_007; + let mut ans: i64 = 1; + let mut cnt: i64 = 0; + let mut last: i64 = 0; + + for (i, ch) in corridor.chars().enumerate() { + if ch == 'S' { + cnt += 1; + if cnt > 2 && cnt % 2 == 1 { + ans = ans * (i as i64 - last) % modv; + } + last = i as i64; + } + } + + if cnt > 0 && cnt % 2 == 0 { + ans as i32 + } else { + 0 + } + } +} +``` + diff --git a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution.rs b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution.rs new file mode 100644 index 0000000000000..3fb1c3e66f6cb --- /dev/null +++ b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution.rs @@ -0,0 +1,43 @@ +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let n: usize = corridor.len(); + let bytes = corridor.as_bytes(); + let modv: i32 = 1_000_000_007; + + let mut f = vec![vec![-1; 3]; n]; + + fn dfs( + i: usize, + k: usize, + n: usize, + bytes: &[u8], + f: &mut Vec>, + modv: i32, + ) -> i32 { + if i >= n { + return if k == 2 { 1 } else { 0 }; + } + if f[i][k] != -1 { + return f[i][k]; + } + + let mut nk = k; + if bytes[i] == b'S' { + nk += 1; + } + if nk > 2 { + return 0; + } + + let mut res = dfs(i + 1, nk, n, bytes, f, modv); + if nk == 2 { + res = (res + dfs(i + 1, 0, n, bytes, f, modv)) % modv; + } + + f[i][k] = res; + res + } + + dfs(0, 0, n, bytes, &mut f, modv) + } +} diff --git a/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution2.rs b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution2.rs new file mode 100644 index 0000000000000..2df7e3919cc14 --- /dev/null +++ b/solution/2100-2199/2147.Number of Ways to Divide a Long Corridor/Solution2.rs @@ -0,0 +1,24 @@ +impl Solution { + pub fn number_of_ways(corridor: String) -> i32 { + let modv: i64 = 1_000_000_007; + let mut ans: i64 = 1; + let mut cnt: i64 = 0; + let mut last: i64 = 0; + + for (i, ch) in corridor.chars().enumerate() { + if ch == 'S' { + cnt += 1; + if cnt > 2 && cnt % 2 == 1 { + ans = ans * (i as i64 - last) % modv; + } + last = i as i64; + } + } + + if cnt > 0 && cnt % 2 == 0 { + ans as i32 + } else { + 0 + } + } +}