Measure the distance between two strings with Ruby?

后端 未结 6 1941
-上瘾入骨i
-上瘾入骨i 2020-11-29 08:18

Can I measure the distance between two strings with Ruby?

I.e.:

compare(\'Test\', \'est\') # Returns 1
compare(\'Test\', \'Tes\') #          


        
6条回答
  •  有刺的猬
    2020-11-29 08:34

    I found this for you:

    def levenshtein_distance(s, t)
      m = s.length
      n = t.length
      return m if n == 0
      return n if m == 0
      d = Array.new(m+1) {Array.new(n+1)}
    
      (0..m).each {|i| d[i][0] = i}
      (0..n).each {|j| d[0][j] = j}
      (1..n).each do |j|
        (1..m).each do |i|
          d[i][j] = if s[i-1] == t[j-1]  # adjust index into string
                      d[i-1][j-1]       # no operation required
                    else
                      [ d[i-1][j]+1,    # deletion
                        d[i][j-1]+1,    # insertion
                        d[i-1][j-1]+1,  # substitution
                      ].min
                    end
        end
      end
      d[m][n]
    end
    
    [ ['fire','water'], ['amazing','horse'], ["bamerindos", "giromba"] ].each do |s,t|
      puts "levenshtein_distance('#{s}', '#{t}') = #{levenshtein_distance(s, t)}"
    end
    

    That's awesome output: =)

    levenshtein_distance('fire', 'water') = 4
    levenshtein_distance('amazing', 'horse') = 7
    levenshtein_distance('bamerindos', 'giromba') = 9
    

    Source: http://rosettacode.org/wiki/Levenshtein_distance#Ruby

提交回复
热议问题