Browse Source

feat: edit_distance2

Zhang Li 1 year ago
parent
commit
8fec09c232
2 changed files with 89 additions and 1 deletions
  1. 87 0
      src/solutions/dp/edit_distance2.rs
  2. 2 1
      src/solutions/dp/mod.rs

+ 87 - 0
src/solutions/dp/edit_distance2.rs

@@ -0,0 +1,87 @@
+struct Solution;
+impl Solution {
+    pub fn min_distance(word1: String, word2: String) -> i32 {
+        let word1 = word1.chars().collect::<Vec<char>>();
+        let word2 = word2.chars().collect::<Vec<char>>();
+        let cols = word1.len();
+        let rows = word2.len();
+        if cols == 0 {
+            return rows as i32;
+        }
+        if rows == 0 {
+            return cols as i32;
+        }
+        let mut dp: Vec<i32> = vec![0;cols];
+        let mut flag = false;
+
+        for i in 0..cols {
+            dp[i] = i as i32 + 1;
+        }
+        // println!("dp: {:?}", dp);
+
+
+        let mut tmp = 0;
+        for i in 0..rows {
+            if word2[i] == word1[0] && !flag {
+                tmp = tmp;
+                flag = true;
+            } else {
+                tmp += 1;
+            }
+            let mut prev = tmp;
+            for j in 0..cols {
+                if j == 0 {
+                    prev = tmp;
+                    continue;
+                }
+                let x = prev;
+
+                prev = if word1[j] != word2[i] {
+                    dp[j-1].min(dp[j]).min(prev) + 1
+                } else {
+                    dp[j-1]
+                };
+                dp[j-1] = x;
+            }
+            dp[cols-1] = prev;
+            // println!("dp: {:?}", dp);
+
+        }
+        dp[cols-1]
+
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_min_distance1() {
+        let word1 = String::from("horse");
+        let word2 = String::from("ros");
+
+        let res = Solution::min_distance(word1, word2);
+        assert_eq!(3, res);
+    }
+
+
+    #[test]
+    fn test_min_distance2() {
+        let word1 = String::from("intention");
+        let word2 = String::from("execution");
+
+        let res = Solution::min_distance(word1, word2);
+        assert_eq!(5, res);
+    }
+
+
+    #[test]
+    fn test_min_distance3() {
+        let word1 = String::from("");
+        let word2 = String::from("execution");
+
+        let res = Solution::min_distance(word1, word2);
+        assert_eq!(9, res);
+    }
+}

+ 2 - 1
src/solutions/dp/mod.rs

@@ -7,4 +7,5 @@ mod trapping_train_water;
 mod unique_paths;
 mod unique_paths_2;
 mod edit_distance;
-mod climbing_stairs;
+mod climbing_stairs;
+mod edit_distance2;