diff --git a/72_edit_distance/Cargo.lock b/72_edit_distance/Cargo.lock new file mode 100644 index 0000000..7f19086 --- /dev/null +++ b/72_edit_distance/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "edit_distance" +version = "0.1.0" diff --git a/72_edit_distance/Cargo.toml b/72_edit_distance/Cargo.toml new file mode 100644 index 0000000..d48b01f --- /dev/null +++ b/72_edit_distance/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "edit_distance" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/72_edit_distance/src/lib.rs b/72_edit_distance/src/lib.rs new file mode 100644 index 0000000..d57a3f0 --- /dev/null +++ b/72_edit_distance/src/lib.rs @@ -0,0 +1,26 @@ +pub struct Solution; + +impl Solution { + pub fn min_distance(word1: String, word2: String) -> i32 { + let mut dp = vec![vec![0; word2.len() + 1]; word1.len() + 1]; + + let word1 = word1.bytes().collect::>(); + let word2 = word2.bytes().collect::>(); + + for len1 in 0..word1.len() + 1 { + for len2 in 0..word2.len() + 1 { + dp[len1][len2] = if len1 == 0 || len2 == 0 { + if len1 > 0 { len1 } else { len2 } + } else if word1[len1 - 1] == word2[len2 - 1] { + dp[len1 - 1][len2 - 1] + } else { + 1 + dp[len1 - 1][len2] + .min(dp[len1][len2 - 1]) + .min(dp[len1 - 1][len2 - 1]) + }; + } + } + + dp[word1.len()][word2.len()] as i32 + } +}