From 8f9f96064591dfd9594bd8b780d613146d905e38 Mon Sep 17 00:00:00 2001 From: Josh Newman Date: Sun, 3 Apr 2016 17:27:27 -0700 Subject: [PATCH 1/3] (Feat) Basic editdistance --- src/editDistance.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/editDistance.js b/src/editDistance.js index 36c7a01..4d2399d 100644 --- a/src/editDistance.js +++ b/src/editDistance.js @@ -1,3 +1,5 @@ var editDistance = function(str1, str2) { - + if (str1 === str2) { + return 0; + } }; \ No newline at end of file From b4e64043ca037deec7d1d39f813d40ccc34653a0 Mon Sep 17 00:00:00 2001 From: Josh Newman Date: Mon, 4 Apr 2016 19:58:02 -0700 Subject: [PATCH 2/3] (Feat) Solution --- src/editDistance.js | 60 ++++++++++++++++++++++++++++++++++++++--- src/fuzzyStringMatch.js | 38 ++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/src/editDistance.js b/src/editDistance.js index 4d2399d..1d20d38 100644 --- a/src/editDistance.js +++ b/src/editDistance.js @@ -1,5 +1,59 @@ +// Note: The metric used here is Damerau–Levenshtein distance. +// This metric imposes a uniform cost for insertion, deletion, +// substitutions, and transposition, as these compose the most +// common human typing mistakes. var editDistance = function(str1, str2) { - if (str1 === str2) { - return 0; - } + if (str1 === str2) { + return 0; + } + + if (!str1.length || !str2.length) { + return str1.length || str2.length; + } + + // Swap strings so can just focus on one + if (str2.length > str1.length) { + var temp = str1; + str1 = str2; + str2 = temp; + } + + var len1 = str1.length; + var len2 = str2.length; + + var prevPrevRow; + var prevRow = []; + + // Fill in previous row with empty subsequences. + for (var col = 0; col <= len2; col++) { + prevRow[col] = col; + } + var currRow = [1]; + + // Fake iterating through the whole matrix, + // but remembering only two rows at a time. + for (var row = 1; row <= len1; row++) { + for (var col = 1; col <= len2; col++) { + + // If two strings match at their final character, their LCS + // is the LCS of their prefixes, plus that final character. + if (str1[row-1] === str2[col-1]) { + currRow[col] = prevRow[col-1]; + + // Otherwise, their LCS is the best LCS that results from + // trimming either of their final characters, plus one. + } else { + var del = prevRow[col] + 1; + var ins = currRow[col-1] + 1; + var sub = prevRow[col-1] + 1; + currRow[col] = Math.min(del, ins, sub); + } + } + prevPrevRow = prevRow; + prevRow = currRow; + currRow = [row + 1]; + } + + return prevRow[len2]; +}; }; \ No newline at end of file diff --git a/src/fuzzyStringMatch.js b/src/fuzzyStringMatch.js index e3fe293..2f26207 100644 --- a/src/fuzzyStringMatch.js +++ b/src/fuzzyStringMatch.js @@ -1,3 +1,41 @@ var fuzzyStringMatch = function(text, query) { + var qLen = query.length; + var tLen = text.length; + + var prevPrevRow; + var prevRow = []; + // Fill in previous row with empty subsequences. + for (var col = 0; col <= tLen; col++) { + prevRow[col] = 0; + } + var currRow = [1]; + + // Fake iterating through the whole matrix, + // but remembering only two rows at a time. + for (var row = 1; row <= qLen; row++) { + for (var col = 1; col <= tLen; col++) { + + // If two strings match at their final character, their LCS + // is the LCS of their prefixes, plus that final character. + if (query[row-1] === text[col-1]) { + currRow[col] = prevRow[col-1]; + + // Otherwise, their LCS is the best LCS that results from + // trimming either of their final characters. + } else { + var del = prevRow[col] + 1; + var ins = currRow[col-1] + 1; + var sub = prevRow[col-1] + 1; + currRow[col] = Math.min(del, ins, sub); + }; + } + prevPrevRow = prevRow; + prevRow = currRow; + currRow = [row + 1]; + } + + var min = Math.min.apply(null, prevRow); + console.log(min, qLen); + return (qLen-min)/qLen; }; From a31600f1236b7b1f724415cb232ef5a682da267b Mon Sep 17 00:00:00 2001 From: Josh Newman Date: Tue, 5 Apr 2016 10:56:17 -0700 Subject: [PATCH 3/3] (Fix) Remove extra closing brace --- index.html | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/editDistance.js | 1 - 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..3aeac5a --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + + + + +
+ String A:
+ String B:
+ +
+
+
+ Output: +
+
+
+
+ String A:
+ String B:
+ +
+
+
+ Output: +
+ + + + + + \ No newline at end of file diff --git a/src/editDistance.js b/src/editDistance.js index 1d20d38..655edeb 100644 --- a/src/editDistance.js +++ b/src/editDistance.js @@ -55,5 +55,4 @@ var editDistance = function(str1, str2) { } return prevRow[len2]; -}; }; \ No newline at end of file