diff options
| author | KyleMiles <krm504@nyu.edu> | 2023-06-27 13:23:41 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2023-07-10 12:58:35 -0400 |
| commit | 0c2634e6791af365acd37c47ca22e571ec1d847c (patch) | |
| tree | c8566563cc006fdeef1cfd55dc213e878ca3cdd8 /rust/examples/dwarf/dwarf_export/src/edit_distance.rs | |
| parent | 0cf69ff7ba7001c0c9ef6754f2dc5f98377d9561 (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.rs | 44 |
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 +} |
