Skip to content

Instantly share code, notes, and snippets.

@chriswoodle
Created September 24, 2018 20:12
Show Gist options
  • Save chriswoodle/483ef6b52dd7fc147d8131c553408c0a to your computer and use it in GitHub Desktop.
Save chriswoodle/483ef6b52dd7fc147d8131c553408c0a to your computer and use it in GitHub Desktop.
const input = process.argv[2];
const test = process.argv[3];
if (!input) {
console.log('Missing input and test string');
console.log('Usage: node minimum-edit-distance.js <input> <test>');
process.exit(1);
}
if (!test) {
console.log('Missing test string')
console.log('Usage: node minimum-edit-distance.js <input> <test>');
process.exit(1);
}
// https://gist.github.com/andrei-m/982927/0efdf215b00e5d34c90fdc354639f87ddc3bd0a5
// Compute the edit distance between the two given strings
function getEditDistance(a, b) {
if (a.length == 0) return b.length;
if (b.length == 0) return a.length;
var matrix = [];
// increment along the first column of each row
var i;
for (i = 0; i <= b.length; i++) {
matrix[i] = [i];
}
// increment each column in the first row
var j;
for (j = 0; j <= a.length; j++) {
matrix[0][j] = j;
}
// Fill in the rest of the matrix
for (i = 1; i <= b.length; i++) {
for (j = 1; j <= a.length; j++) {
if (b.charAt(i - 1) == a.charAt(j - 1)) {
matrix[i][j] = matrix[i - 1][j - 1];
} else {
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
Math.min(matrix[i][j - 1] + 1, // insertion
matrix[i - 1][j] + 1)); // deletion
}
}
}
// Display matrix and inputs
for (i = b.length; i >= 1; i--) {
console.log(test[i - 1] + '\t' + matrix[i].filter((v, i) => i != 0).reduce((p, c, i) => { return p + '\t' + c }))
}
console.log(' \t' + input.split('').reduce((p, c) => { return p + '\t' + c }))
return matrix[b.length][a.length];
};
const distance = getEditDistance(input, test);
console.log('Minimum edit is:', distance)
/*
$ node minimum-edit-distance.js gwkki hello
o 5 5 5 5 5
l 4 4 4 4 5
l 3 3 3 4 5
e 2 2 3 4 5
h 1 2 3 4 5
g w k k i
Minimum edit is: 5
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment