@@ -24,24 +24,20 @@ pub struct Solution {}
2424
2525impl 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