summaryrefslogtreecommitdiff
path: root/utils/src/legacy/levenshtein_distance.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-03-12 14:28:08 +0800
committer魏曹先生 <1992414357@qq.com>2026-03-12 14:28:08 +0800
commit0a95bae451c1847f4f0b9601e60959f4e8e6b669 (patch)
tree9e1cfad4f86a73176a4d738b28e7732b66fe5f97 /utils/src/legacy/levenshtein_distance.rs
parent8564c8f2177dec0c2c0c031d156347fa6b4485bc (diff)
Refactor display utilities
Diffstat (limited to 'utils/src/legacy/levenshtein_distance.rs')
-rw-r--r--utils/src/legacy/levenshtein_distance.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/utils/src/legacy/levenshtein_distance.rs b/utils/src/legacy/levenshtein_distance.rs
new file mode 100644
index 0000000..6bdb7e7
--- /dev/null
+++ b/utils/src/legacy/levenshtein_distance.rs
@@ -0,0 +1,34 @@
+use std::cmp::min;
+
+pub fn levenshtein_distance(a: &str, b: &str) -> usize {
+ let a_chars: Vec<char> = a.chars().collect();
+ let b_chars: Vec<char> = b.chars().collect();
+ let a_len = a_chars.len();
+ let b_len = b_chars.len();
+
+ if a_len == 0 {
+ return b_len;
+ }
+ if b_len == 0 {
+ return a_len;
+ }
+
+ let mut dp = vec![vec![0; b_len + 1]; a_len + 1];
+
+ for (i, row) in dp.iter_mut().enumerate() {
+ row[0] = i;
+ }
+
+ for (j, cell) in dp[0].iter_mut().enumerate() {
+ *cell = j;
+ }
+
+ for (i, a_char) in a_chars.iter().enumerate() {
+ for (j, b_char) in b_chars.iter().enumerate() {
+ let cost = if a_char == b_char { 0 } else { 1 };
+ dp[i + 1][j + 1] = min(dp[i][j + 1] + 1, min(dp[i + 1][j] + 1, dp[i][j] + cost));
+ }
+ }
+
+ dp[a_len][b_len]
+}