diff options
Diffstat (limited to 'guides/rails_guides/levenshtein.rb')
-rw-r--r-- | guides/rails_guides/levenshtein.rb | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/guides/rails_guides/levenshtein.rb b/guides/rails_guides/levenshtein.rb new file mode 100644 index 0000000000..2213ef754d --- /dev/null +++ b/guides/rails_guides/levenshtein.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RailsGuides + module Levenshtein + # This code is based directly on the Text gem implementation. + # Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher. + # + # Returns a value representing the "cost" of transforming str1 into str2 + def self.distance(str1, str2) + s = str1 + t = str2 + n = s.length + m = t.length + + return m if 0 == n + return n if 0 == m + + d = (0..m).to_a + x = nil + + # avoid duplicating an enumerable object in the loop + str2_codepoint_enumerable = str2.each_codepoint + + str1.each_codepoint.with_index do |char1, i| + e = i + 1 + + str2_codepoint_enumerable.with_index do |char2, j| + cost = (char1 == char2) ? 0 : 1 + x = [ + d[j + 1] + 1, # insertion + e + 1, # deletion + d[j] + cost # substitution + ].min + d[j] = e + e = x + end + + d[m] = x + end + + x + end + end +end |