|
@@ -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);
|
|
|
+ }
|
|
|
+}
|