#![deny(missing_docs)]
pub fn edit_distance(a: impl AsRef<str>, b: impl AsRef<str>) -> usize {
let len_a = a.as_ref().chars().count();
let len_b = b.as_ref().chars().count();
if len_a < len_b {
return edit_distance(b, a);
}
if len_a == 0 {
return len_b;
} else if len_b == 0 {
return len_a;
}
let len_b = len_b + 1;
let mut pre;
let mut tmp;
let mut cur = vec![0; len_b];
for i in 1..len_b {
cur[i] = i;
}
for (i, ca) in a.as_ref().chars().enumerate() {
pre = cur[0];
cur[0] = i + 1;
for (j, cb) in b.as_ref().chars().enumerate() {
tmp = cur[j + 1];
cur[j + 1] = std::cmp::min(
tmp + 1,
std::cmp::min(
cur[j] + 1,
pre + if ca == cb { 0 } else { 1 },
),
);
pre = tmp;
}
}
cur[len_b - 1]
}