62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
|
(function (exports) {
|
||
|
'use strict';
|
||
|
|
||
|
var levenshteinDistance = (function () {
|
||
|
|
||
|
function levenshteinDistance (s, ls, t, lt) {
|
||
|
var memo = [];
|
||
|
var currRowMemo;
|
||
|
var i;
|
||
|
var k;
|
||
|
|
||
|
for (k = 0; k <= lt; k += 1) {
|
||
|
memo[k] = k;
|
||
|
}
|
||
|
|
||
|
for (i = 1; i <= ls; i += 1) {
|
||
|
currRowMemo = [i];
|
||
|
|
||
|
for (k = 1; k <= lt; k += 1) {
|
||
|
currRowMemo[k] = Math.min(
|
||
|
currRowMemo[k - 1] + 1,
|
||
|
memo[k] + 1,
|
||
|
memo[k - 1] + (s[i - 1] !== t[k - 1] ? 1 : 0)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
memo = currRowMemo;
|
||
|
}
|
||
|
|
||
|
return memo[lt];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The Levenshtein distance between two strings is a minimum number
|
||
|
* of edits needed to transform one string into the other, with the
|
||
|
* allowable edit operations being insertion, deletion,
|
||
|
* or substitution of a single character.
|
||
|
*
|
||
|
* @public
|
||
|
* @module others/levenshtein-distance
|
||
|
*
|
||
|
* @example
|
||
|
*
|
||
|
* var dist = require('path-to-algorithms/src/others/' +
|
||
|
* 'levenshtein-distance').levenshteinDistance;
|
||
|
* console.log(dist('kitten', 'sitting')); // 3
|
||
|
*
|
||
|
* @param {String} s Source string.
|
||
|
* @param {String} t Target string.
|
||
|
* @return {Number} Minimum number of edits needed
|
||
|
* to transform source string into the target string.
|
||
|
*/
|
||
|
return function (s, t) {
|
||
|
return levenshteinDistance(s, s.length, t, t.length);
|
||
|
};
|
||
|
}());
|
||
|
|
||
|
exports.levenshteinDistance = levenshteinDistance;
|
||
|
|
||
|
}(typeof exports === 'undefined' ? window : exports));
|
||
|
|