Skip to content

Instantly share code, notes, and snippets.

@Dzejkop
Created May 12, 2019 13:45
Show Gist options
  • Save Dzejkop/1731f07f6e33933f381756b75cf8e8bf to your computer and use it in GitHub Desktop.
Save Dzejkop/1731f07f6e33933f381756b75cf8e8bf to your computer and use it in GitHub Desktop.
Misc
pub fn levenshtein_distance(a: &str, b: &str) -> usize {
let a: Vec<char> = a.chars().collect();
let b: Vec<char> = b.chars().collect();
levenshtein_distance_inner(&a, &b)
}
fn levenshtein_distance_inner(a: &[char], b: &[char]) -> usize {
if a.len() == 0 {
return b.len();
}
if b.len() == 0 {
return a.len();
}
let cost = if b.get(b.len() - 1) == a.get(a.len() - 1) { 0 }
else { 1 };
let cases = [
levenshtein_distance_inner(a, &b[..b.len() - 1]) + 1,
levenshtein_distance_inner(&a[..a.len() - 1], b) + 1,
levenshtein_distance_inner(&a[..a.len() - 1], &b[..b.len() - 1]) + cost,
];
*cases.iter().min().unwrap()
}
#[test]
fn tests() {
let comp = |a, b, v| assert_eq!(levenshtein_distance(a, b), v);
comp("abc", "abc", 0);
comp("abc", "abd", 1);
comp("abc", "acd", 2);
comp("abc", "xyz", 3);
comp("abc", "abcd", 1);
comp("abc", "abcde", 2);
comp("abc", "abcdef", 3);
comp("abc", "ab", 1);
comp("abc", "a", 2);
comp("abc", "", 3);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment