@@ -10,23 +10,37 @@ struct Solution {}
10
10
11
11
// ----------------------------------------------------------------------------
12
12
13
+ use std:: collections:: HashMap ;
14
+
13
15
impl Solution {
14
- pub fn min_distance ( word1 : String , word2 : String ) -> i32 {
15
- if word1. len ( ) == 0 {
16
- return word2. len ( ) as i32 ;
17
- }
18
- if word2. len ( ) == 0 {
19
- return word1. len ( ) as i32 ;
16
+ pub fn reduce_min_distance (
17
+ word1 : String ,
18
+ word2 : String ,
19
+ cache : & mut HashMap < ( String , String ) , usize > ,
20
+ ) -> usize {
21
+ let ( length1, length2) = ( word1. len ( ) , word2. len ( ) ) ;
22
+ if length1 == 0 || length2 == 0 {
23
+ let min = length1. max ( length2) ;
24
+ cache. insert ( ( word1. clone ( ) , word2. clone ( ) ) , min) ;
25
+ return min;
20
26
}
21
- let w1 = word1[ 1 ..] . to_string ( ) ;
22
- let w2 = word2[ 1 ..] . to_string ( ) ;
27
+ let word1_slice = word1[ 1 ..] . to_string ( ) ;
28
+ let word2_slice = word2[ 1 ..] . to_string ( ) ;
23
29
if word1. chars ( ) . next ( ) . unwrap ( ) == word2. chars ( ) . next ( ) . unwrap ( ) {
24
- return Solution :: min_distance ( w1 . clone ( ) , w2 . clone ( ) ) ;
30
+ return Solution :: reduce_min_distance ( word1_slice . clone ( ) , word2_slice . clone ( ) , cache ) ;
25
31
}
26
- let insert = 1 + Solution :: min_distance ( word1. clone ( ) , w2. clone ( ) ) ; // insert the first char of word2 in front of word1
27
- let delete = 1 + Solution :: min_distance ( w1. clone ( ) , word2. clone ( ) ) ; // delete the first char of word1
28
- let edit = 1 + Solution :: min_distance ( w1. clone ( ) , w2. clone ( ) ) ; // change from the first char of word1 to the one of word2
29
- * [ insert, delete, edit] . iter ( ) . min ( ) . unwrap ( )
32
+ let insert = 1 + Solution :: reduce_min_distance ( word1. clone ( ) , word2_slice. clone ( ) , cache) ; // insert the first char of word2 in front of word1
33
+ let delete = 1 + Solution :: reduce_min_distance ( word1_slice. clone ( ) , word2. clone ( ) , cache) ; // delete the first char of word1
34
+ let edit =
35
+ 1 + Solution :: reduce_min_distance ( word1_slice. clone ( ) , word2_slice. clone ( ) , cache) ; // change from the first char of word1 to the one of word2
36
+ let min = * [ insert, delete, edit] . iter ( ) . min ( ) . unwrap ( ) ;
37
+ cache. insert ( ( word1. clone ( ) , word2. clone ( ) ) , min) ;
38
+ min
39
+ }
40
+
41
+ pub fn min_distance ( word1 : String , word2 : String ) -> i32 {
42
+ let mut cache = HashMap :: new ( ) ;
43
+ Self :: reduce_min_distance ( word1, word2, & mut cache) as i32
30
44
}
31
45
}
32
46
0 commit comments