@@ -24,24 +24,20 @@ pub struct Solution {}
24
24
25
25
impl Solution {
26
26
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)
28
31
}
29
32
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
45
41
}
46
42
}
47
43
0 commit comments