Skip to content

Commit cce0077

Browse files
committed
refine #97
1 parent 56a4944 commit cce0077

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

src/n0097_interleaving_string.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,20 @@ pub struct Solution {}
2424

2525
impl Solution {
2626
pub fn is_interleave(s1: String, s2: String, s3: String) -> bool {
27-
Solution::backtrack(&s1, &s2, &s3)
27+
let mut cache = vec![vec![false;s2.len()+1];s1.len()+1];
28+
Solution::dfs(&s1.chars().collect(),
29+
&s2.chars().collect(),
30+
&s3.chars().collect(), 0, 0, 0, &mut cache)
2831
}
2932

30-
fn backtrack(s1: &str, s2: &str, s3: &str) -> bool {
31-
if s3.len() < 1 && s1.len() < 1 && s2.len() < 1 {
32-
return true;
33-
}
34-
if s1.len() > 0 && s3.len() > 0 && &s1[0..1] == &s3[0..1] {
35-
if Solution::backtrack(&s1[1..], s2, &s3[1..]) {
36-
return true;
37-
}
38-
}
39-
if s2.len() > 0 && s3.len() > 0 && &s2[0..1] == &s3[0..1] {
40-
if Solution::backtrack(s1, &s2[1..], &s3[1..]) {
41-
return true;
42-
}
43-
}
44-
false
33+
fn dfs(s1: &Vec<char>, s2: &Vec<char>, s3: &Vec<char>, i: usize, j: usize, k: usize, invalid: &mut Vec<Vec<bool>>) -> bool {
34+
if invalid[i][j] { return false }
35+
if i == s1.len() && j == s2.len() && k == s3.len() { return true }
36+
let valid =
37+
(i < s1.len() && k < s3.len() && s1[i] == s3[k] && Solution::dfs(s1,s2,s3,i+1,j,k+1,invalid)) ||
38+
(j < s2.len() && k < s3.len() && s2[j] == s3[k] && Solution::dfs(s1,s2,s3,i,j+1,k+1,invalid));
39+
if !valid { invalid[i][j] = true }
40+
valid
4541
}
4642
}
4743

0 commit comments

Comments
 (0)