判斷兩個字符串從不相同到相同最少需要幾次變化

出處:這里這里

 #判斷兩個字符串從不相同到相同最少需要幾次變化(增加字符、刪除字符、替換字符)
  def levenshtein_distance(s, t)
    m = s.length
    n = t.length
    return m if n == 0
    return n if m == 0
    #初始化一個二維數組,行數是s字符串的長度+1,列數是t字符串的長度+1
    d = Array.new(m+1) {Array.new(n+1)}
    #將第一行和第一列的值初始化。
    #d[m][0]表示從一個空字符串變成與s相等的字符串最少需要幾步
    #d[0][n]表示從一個空字符串變成與t相等的字符串最少需要幾步
    #d[0][0]表示兩個空字符串需要0步就相等了
    (0..m).each {|i| d[i][0] = i}
    (0..n).each {|j| d[0][j] = j}
    #至此,數據初始化結束,因為多了一行和一列,每一個交叉點,比如d[i][j]的左方向、上方向以及左上角都有一個值,
    # d.each {|ele| p ele}
    #開始遍歷
    (1..n).each do |j|
      (1..m).each do |i|
        #判斷同位置的字符是否相同,相同的話,就將左上角位置的值寫入。表示本次比較并不需要任何操作
        if s[i-1] == t[j-1]  # adjust index into string
          d[i][j] = d[i-1][j-1]       # no operation required
        else
        #如果不相同,則計算刪除字符串、增加字符串、替換字符串經過的步數。
          d[i][j] = [ 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]的值越大,表示兩個字符串變成相同所需要經過的步數越多,意味著兩個字符串越不相似
    d[m][n]
  end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容