From 091040116d526a65b3dd0685f70e50bd7f2f2814 Mon Sep 17 00:00:00 2001 From: Henrik Holst <6200749+hholst80@users.noreply.github.com> Date: Wed, 10 Jan 2024 22:33:39 +0100 Subject: [PATCH] strings: fix levenshtein_distance function correctness after #20435 (#20474) --- vlib/strings/similarity.v | 17 ++++++++++++----- vlib/strings/similarity_test.v | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/vlib/strings/similarity.v b/vlib/strings/similarity.v index 067a05a0b6de43..a57acfda3af9f7 100644 --- a/vlib/strings/similarity.v +++ b/vlib/strings/similarity.v @@ -1,8 +1,15 @@ module strings @[inline] -fn imin(x u16, y u16) u16 { - return if x < y { x } else { y } +fn min(a u16, b u16, c u16) u16 { + mut m := a + if b < m { + m = b + } + if c < m { + m = c + } + return m } // levenshtein_distance uses the Levenshtein Distance algorithm to calculate @@ -21,13 +28,13 @@ pub fn levenshtein_distance(a string, b string) int { mut row := []u16{len: a.len + 1, init: u16(index)} - for i := 1; i < b.len; i++ { + for i := 1; i < b.len + 1; i++ { mut prev := u16(i) - for j := 1; j < a.len; j++ { + for j := 1; j < a.len + 1; j++ { mut current := row[j - 1] // match if b[i - 1] != a[j - 1] { // insertion, substitution, deletion - current = imin(imin(row[j - 1] + 1, prev + 1), row[j] + 1) + current = min(row[j - 1] + 1, prev + 1, row[j] + 1) } row[j - 1] = prev prev = current diff --git a/vlib/strings/similarity_test.v b/vlib/strings/similarity_test.v index 965da450cd89f4..a3153b93e3bb81 100644 --- a/vlib/strings/similarity_test.v +++ b/vlib/strings/similarity_test.v @@ -10,4 +10,5 @@ fn test_levenshtein_distance() { assert strings.levenshtein_distance('hugs', 'shrugs') == 2 assert strings.levenshtein_distance('broom', 'shroom') == 2 assert strings.levenshtein_distance('flomax', 'volmax') == 3 + assert strings.levenshtein_distance('ab', 'cd') == 2 }