aboutsummaryrefslogtreecommitdiffstats
path: root/guides/rails_guides/levenshtein.rb
diff options
context:
space:
mode:
Diffstat (limited to 'guides/rails_guides/levenshtein.rb')
-rw-r--r--guides/rails_guides/levenshtein.rb39
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