JavaScriptでレーベンシュタイン距離を求めるプログラムを書いてみたので、ここにメモしておきます。レーベンシュタイン距離とは、文字列同士の編集距離を表します。スペルチェックなどにも用いられるものです。

参考) レーベンシュタイン距離(Wikipedia)(英語版)

#!/usr/bin/env rhino
// レーベンシュタイン距離を求める関数
function calcDist(a, b) {
  if (a == b) return 0;
  if (a.length == 0) return b.length;
  if (b.length == 0) return a.length;
  var matrix = new Array(a.length + 1);
  for (var i = 0; i <= a.length; i++)
    matrix[i] = new Array(b.length + 1);
  for (var i = 0; i <= a.length; i++)
    matrix[i][0] = i;
  for (var j = 0; j <= b.length; j++)
    matrix[0][j] = j;
  for (var i = 1; i <= a.length; i++) {
    for (var j = 1; j <= b.length; j++) {
      var x = a[i - 1] == b[j -1] ? 0 : 1;
      matrix[i][j] = Math.min(
        matrix[i - 1][j] + 1,
        matrix[i][j - 1] + 1,
        matrix[i - 1][j- 1] + x
      );
    }
  }
  return matrix[a.length][b.length];
}
// ---
// テスト
var base = "今日は猫がよくなく。";
var list = [
  base,
  "こたつで猫が丸くなる。",
  "今猫がなく。",
  "昨日は猫がよくないた。",
  "今日は孫がよくなく。",
  "昨日孫の調子がよくなく。",
  "イタリアにも猫がよくいる。"
];
list.sort(function (a, b) {
  return calcDist(base, a) - calcDist(base, b);
});
for (var i in list) {
  var dist = calcDist(base, list[i]);
  print(dist + "\t" + list[i]);
}

実行結果:

0	今日は猫がよくなく。
1	今日は孫がよくなく。
3	昨日は猫がよくないた。
4	今猫がなく。
5	昨日孫の調子がよくなく。
6	こたつで猫が丸くなる。
8	イタリアにも猫がよくいる。