@technobuddha/library
Version:
A large library of useful functions
60 lines (59 loc) • 2.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.levenshteinDistance = void 0;
var create2DArray_1 = __importDefault(require("../create2DArray"));
/**
* Compute the levenshtein distance between two strings (similarity)
*
* @param input The string
* @param comparedTo The string to compare to
* @param __namedParameters see {@link Options}
* @default caseInsensitive true
* @returns the levenshteinDistance between the two strings (0 for no similarity through 1 for equal)
*/
function levenshteinDistance(input, comparedTo, _a) {
var _b = _a === void 0 ? {} : _a, _c = _b.caseInsensitive, caseInsensitive = _c === void 0 ? true : _c;
if (input.length === 0 || comparedTo.length === 0)
return Math.max(input.length, comparedTo.length);
if (caseInsensitive) {
input = input.toLowerCase();
comparedTo = comparedTo.toLowerCase();
}
var inputLen = input.length;
var comparedToLen = comparedTo.length;
var matrix = create2DArray_1.default(inputLen, comparedToLen, 0);
//initialize
for (var i = 0; i < inputLen; ++i)
matrix[i][0] = i;
for (var i = 0; i < comparedToLen; ++i)
matrix[0][i] = i;
//analyze
for (var i = 1; i < inputLen; ++i) {
var si = input.charAt(i - 1);
for (var j = 1; j < comparedToLen; ++j) {
var tj = comparedTo.charAt(j - 1);
var cost = (si === tj) ? 0 : 1;
var above = matrix[i - 1][j];
var left = matrix[i][j - 1];
var diag = matrix[i - 1][j - 1];
var cell = Math.min(Math.min(above + 1, left + 1), diag + cost);
//transposition
if (i > 1 && j > 1) {
var trans = matrix[i - 2][j - 2] + 1;
if (input.charAt(i - 2) !== comparedTo.charAt(j - 1))
trans++;
if (input.charAt(i - 1) !== comparedTo.charAt(j - 2))
trans++;
if (cell > trans)
cell = trans;
}
matrix[i][j] = cell;
}
}
return matrix[inputLen - 1][comparedToLen - 1];
}
exports.levenshteinDistance = levenshteinDistance;
exports.default = levenshteinDistance;