UNPKG

string-metric

Version:

Get string similarity in JavaScript or TypeScript

60 lines (59 loc) 2.05 kB
"use strict"; 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;