Определение дистанции Левенштейна


Неожиданно потребовалась функция, которая бы эффективно вычисляла
расстояние между двумя словами. Применить функцию планировалось
прямо под виндой, где php не было (В php эта функция уже давно встроена).
Поэтому гугл позволил найти следующую реализацию, адаптированную под
нужды и синтаксис WSH. Итак, скрипт test.js, сделан в нотепаде на коленке:

function LevenshteinDistance(s1, s2)
{
    var lengthS1 = s1.length;
    var lengthS2 = s2.length;
    // var tab = int[lengthS1 + 1][lengthS2 + 1]; // не катит
    var tab = new Array(); 
    tab.length = lengthS1 + 1;
    for( i=0; i<=lengthS1; i++) {
	tab[i] = new Array();
	tab[i].length = lengthS2 + 1;
    }
    var i, j, diff;
    for (i = 0; i <= lengthS1; i++)
        tab[i][0] = i;
    for (j = 0; j <= lengthS2; j++)
        tab[0][j] = j;
    for (i = 1; i <= lengthS1; i++)
    {
        for(j = 1; j <= lengthS2; j++ )
        {
            if ( s1.charAt( i - 1 ) == s2.charAt( j - 1 ) )
                diff = 0;
            else
                diff = 1;
            tab[i][j] = Math.min( Math.min(tab[i-1][j] + 1,   // insertion
                                 tab[i][j-1] + 1),            // deletion
                                 tab[i-1][j-1] + diff);       // substitution
        }
    }
    return tab[lengthS1][lengthS2];
}


WScript.Echo(LevenshteinDistance('Кит','Кoт'));

Запускается элементарно: Пуск/Выполнить/ - набираем cmd - Enter - пишем:

> cscript test.js

Для тех, кто не знает что такое функция Левенштейна кратко поясним - это функция
которая показывает сколько замен необходимо произвести, чтобы из слова А сделать
слово Б. Например для слов "кот" и "кит" это будет 1, а для "мама" и "папа" - 2.

В данном случае реализована функция Дамерау-Левенштейна, которая отличается от обычной функции
Левенштейна тем, что учитывает соседние перестановки (а не только вставки, удаления и замены)