diff options
Diffstat (limited to 'guides/rails_guides/levenshtein.rb')
-rw-r--r-- | guides/rails_guides/levenshtein.rb | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/guides/rails_guides/levenshtein.rb b/guides/rails_guides/levenshtein.rb new file mode 100644 index 0000000000..8a908a4339 --- /dev/null +++ b/guides/rails_guides/levenshtein.rb @@ -0,0 +1,39 @@ +module RailsGuides + module Levenshtein + # This code is based directly on the Text gem implementation + # 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 + max = n/2 + + return m if (0 == n) + return n if (0 == m) + return n if (n - m).abs > max + + d = (0..m).to_a + x = nil + + str1.each_char.each_with_index do |char1,i| + e = i+1 + + str2.each_char.each_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 + + return x + end + end +end |