pub async fn levenshtein_distance(s1: &str, s2: &str) -> usize {
let len1: usize = s1.len();
let len2: usize = s2.len();
let mut dp: Vec<Vec<usize>> = vec![vec![0; len2 + 1]; len1 + 1];
for i in 0..=len1 {
dp[i][0] = i;
}
for j in 0..=len2 {
dp[0][j] = j;
}
for i in 1..=len1 {
for j in 1..=len2 {
let cost = if s1.chars().nth(i - 1) == s2.chars().nth(j - 1) {
0
} else {
1
};
dp[i][j] = *[dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost]
.iter()
.min()
.unwrap();
}
}
dp[len1][len2]
}