diff --git a/solution/0000-0099/0097.Interleaving String/README.md b/solution/0000-0099/0097.Interleaving String/README.md index 3925e7ce32ddf..9303e7d637a9d 100644 --- a/solution/0000-0099/0097.Interleaving String/README.md +++ b/solution/0000-0099/0097.Interleaving String/README.md @@ -347,6 +347,53 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn is_interleave(s1: String, s2: String, s3: String) -> bool { + let n = s1.len(); + let m = s2.len(); + + if s1.len() + s2.len() != s3.len() { + return false; + } + + let mut record = vec![vec![-1; m + 1]; n + 1]; + + Self::dfs(&mut record, n, m, 0, 0, &s1.chars().collect(), &s2.chars().collect(), &s3.chars().collect()) + } + + #[allow(dead_code)] + fn dfs(record: &mut Vec>, n: usize, m: usize, i: usize, j: usize, s1: &Vec, s2: &Vec, s3: &Vec) -> bool { + if i >= n && j >= m { + return true; + } + + if record[i][j] != -1 { + return record[i][j] == 1; + } + + // Set the initial value + record[i][j] = 0; + let k = i + j; + + // Let's try `s1` first + if i < n && s1[i] == s3[k] && Self::dfs(record, n, m, i + 1, j, s1, s2, s3) { + record[i][j] = 1; + } + + // If the first approach does not succeed, let's then try `s2` + if record[i][j] == 0 && j < m && s2[j] == s3[k] && Self::dfs(record, n, m, i, j + 1, s1, s2, s3) { + record[i][j] = 1; + } + + record[i][j] == 1 + } +} +``` + ### **Go** ```go diff --git a/solution/0000-0099/0097.Interleaving String/README_EN.md b/solution/0000-0099/0097.Interleaving String/README_EN.md index 4035b183344d6..0805bc264bdc3 100644 --- a/solution/0000-0099/0097.Interleaving String/README_EN.md +++ b/solution/0000-0099/0097.Interleaving String/README_EN.md @@ -299,6 +299,53 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn is_interleave(s1: String, s2: String, s3: String) -> bool { + let n = s1.len(); + let m = s2.len(); + + if s1.len() + s2.len() != s3.len() { + return false; + } + + let mut record = vec![vec![-1; m + 1]; n + 1]; + + Self::dfs(&mut record, n, m, 0, 0, &s1.chars().collect(), &s2.chars().collect(), &s3.chars().collect()) + } + + #[allow(dead_code)] + fn dfs(record: &mut Vec>, n: usize, m: usize, i: usize, j: usize, s1: &Vec, s2: &Vec, s3: &Vec) -> bool { + if i >= n && j >= m { + return true; + } + + if record[i][j] != -1 { + return record[i][j] == 1; + } + + // Set the initial value + record[i][j] = 0; + let k = i + j; + + // Let's try `s1` first + if i < n && s1[i] == s3[k] && Self::dfs(record, n, m, i + 1, j, s1, s2, s3) { + record[i][j] = 1; + } + + // If the first approach does not succeed, let's then try `s2` + if record[i][j] == 0 && j < m && s2[j] == s3[k] && Self::dfs(record, n, m, i, j + 1, s1, s2, s3) { + record[i][j] = 1; + } + + record[i][j] == 1 + } +} +``` + ### **Go** ```go diff --git a/solution/0000-0099/0097.Interleaving String/Solution.rs b/solution/0000-0099/0097.Interleaving String/Solution.rs new file mode 100644 index 0000000000000..a22b98a0c5631 --- /dev/null +++ b/solution/0000-0099/0097.Interleaving String/Solution.rs @@ -0,0 +1,42 @@ +impl Solution { + #[allow(dead_code)] + pub fn is_interleave(s1: String, s2: String, s3: String) -> bool { + let n = s1.len(); + let m = s2.len(); + + if s1.len() + s2.len() != s3.len() { + return false; + } + + let mut record = vec![vec![-1; m + 1]; n + 1]; + + Self::dfs(&mut record, n, m, 0, 0, &s1.chars().collect(), &s2.chars().collect(), &s3.chars().collect()) + } + + #[allow(dead_code)] + fn dfs(record: &mut Vec>, n: usize, m: usize, i: usize, j: usize, s1: &Vec, s2: &Vec, s3: &Vec) -> bool { + if i >= n && j >= m { + return true; + } + + if record[i][j] != -1 { + return record[i][j] == 1; + } + + // Set the initial value + record[i][j] = 0; + let k = i + j; + + // Let's try `s1` first + if i < n && s1[i] == s3[k] && Self::dfs(record, n, m, i + 1, j, s1, s2, s3) { + record[i][j] = 1; + } + + // If the first approach does not succeed, let's then try `s2` + if record[i][j] == 0 && j < m && s2[j] == s3[k] && Self::dfs(record, n, m, i, j + 1, s1, s2, s3) { + record[i][j] = 1; + } + + record[i][j] == 1 + } +} \ No newline at end of file