summaryrefslogtreecommitdiff
path: root/rust/examples/dwarf/dwarf_export/src/edit_distance.rs
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2023-06-27 13:23:41 -0400
committerKyleMiles <krm504@nyu.edu>2023-07-10 12:58:35 -0400
commit0c2634e6791af365acd37c47ca22e571ec1d847c (patch)
treec8566563cc006fdeef1cfd55dc213e878ca3cdd8 /rust/examples/dwarf/dwarf_export/src/edit_distance.rs
parent0cf69ff7ba7001c0c9ef6754f2dc5f98377d9561 (diff)
DWARF Export : Improve Default Parameter Handling
Diffstat (limited to 'rust/examples/dwarf/dwarf_export/src/edit_distance.rs')
-rw-r--r--rust/examples/dwarf/dwarf_export/src/edit_distance.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/rust/examples/dwarf/dwarf_export/src/edit_distance.rs b/rust/examples/dwarf/dwarf_export/src/edit_distance.rs
new file mode 100644
index 00000000..9f135451
--- /dev/null
+++ b/rust/examples/dwarf/dwarf_export/src/edit_distance.rs
@@ -0,0 +1,44 @@
+pub(crate) fn distance(a: &str, b: &str) -> usize {
+ if a == b {
+ return 0;
+ }
+ match (a.chars().count(), b.chars().count()) {
+ (0, b) => return b,
+ (a, 0) => return a,
+ // (a_len, b_len) if a_len < b_len => return distance(b, a),
+ _ => (),
+ }
+
+ let mut result = 0;
+ let mut cache: Vec<usize> = (1..a.chars().count() + 1).collect();
+
+ for (index_b, char_b) in b.chars().enumerate() {
+ result = index_b;
+ let mut distance_a = index_b;
+
+ for (index_a, char_a) in a.chars().enumerate() {
+ let distance_b = if char_a == char_b {
+ distance_a
+ } else {
+ distance_a + 1
+ };
+
+ distance_a = cache[index_a];
+
+ result = if distance_a > result {
+ if distance_b > result {
+ result + 1
+ } else {
+ distance_b
+ }
+ } else if distance_b > distance_a {
+ distance_a + 1
+ } else {
+ distance_b
+ };
+
+ cache[index_a] = result;
+ }
+ }
+ result
+}