string-metric
Version:
Get string similarity in JavaScript or TypeScript
60 lines (59 loc) • 2.05 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.OptimalStringAlignment = void 0;
var utils_1 = require("./utils/utils");
var OptimalStringAlignment = /** @class */ (function () {
function OptimalStringAlignment() {
}
OptimalStringAlignment.prototype.distance = function (s1, s2) {
if (utils_1.isNullOrUndefined(s1)) {
throw new Error('s1 must neither be null nor undefined');
}
if (utils_1.isNullOrUndefined(s2)) {
throw new Error('s2 must neither be null nor undefined');
}
if (s1 === s2) {
return 0;
}
var n = s1.length;
var m = s2.length;
if (n == 0) {
return m;
}
if (m == 0) {
return n;
}
var d = utils_1.createTwoDimensionalArray(n + 2, m + 2);
for (var i = 0; i <= n; i++) {
d[i][0] = i;
}
for (var j = 0; j <= m; j++) {
d[0][j] = j;
}
var cost;
for (var i = 1; i <= n; i++) {
for (var j = 1; j <= m; j++) {
cost = 1;
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
cost = 0;
}
d[i][j] = this.min(d[i - 1][j - 1] + cost, // substitution
d[i][j - 1] + 1, // insertion
d[i - 1][j] + 1 // deletion
);
//transposition check
if (i > 1 && j > 1
&& s1.charAt(i - 1) === s2.charAt(j - 2)
&& s1.charAt(i - 2) === s2.charAt(j - 1)) {
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
}
}
}
return d[n][m];
};
OptimalStringAlignment.prototype.min = function (a, b, c) {
return Math.min(a, Math.min(b, c));
};
return OptimalStringAlignment;
}());
exports.OptimalStringAlignment = OptimalStringAlignment;
;