From 219297f0d57265fe3282bfa40ea639479fa225dd Mon Sep 17 00:00:00 2001 From: Suhail Malik Date: Sun, 4 Oct 2020 19:43:01 +0530 Subject: [PATCH 1/2] DP Edit Distance Algorithm --- Dynamic-Programming/EditDistance.js | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Dynamic-Programming/EditDistance.js diff --git a/Dynamic-Programming/EditDistance.js b/Dynamic-Programming/EditDistance.js new file mode 100644 index 0000000000..b77143e54c --- /dev/null +++ b/Dynamic-Programming/EditDistance.js @@ -0,0 +1,61 @@ +/* +Wikipedia -> https://en.wikipedia.org/wiki/Edit_distance + +Q. -> Given two strings `word1` and `word2`. You can perform these operations on any of the string to make both strings similar. + - Insert + - Remove + - Replace +Find the minimum operation cost required to make both same. Each operation cost is 1. + +Algorithm details -> +time complexity - O(n*m) +space complexity - O(n*m) +*/ + +const minimumEditDistance = (word1, word2) => { + const n = word1.length + const m = word2.length + const dp = new Array(m + 1).fill(0).map(item => []) + + /* + fill dp matrix with default values - + - first row is filled considering no elements in word2. + - first column filled considering no elements in word1. + */ + + for (let i = 0; i < n + 1; i++) { + dp[0][i] = i + } + + for (let i = 0; i < m + 1; i++) { + dp[i][0] = i + } + + /* + indexing is 1 based for dp matrix as we defined some known values at first row and first column/ + */ + + for (let i = 1; i < m + 1; i++) { + for (let j = 1; j < n + 1; j++) { + const letter1 = word1[j - 1] + const letter2 = word2[i - 1] + + if (letter1 === letter2) { + dp[i][j] = dp[i - 1][j - 1] + } else { + dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1 + } + } + } + + return dp[m][n] +} + +const main = () => { + console.log(minimumEditDistance("horse", "ros")) + console.log(minimumEditDistance("cat", "cut")) + console.log(minimumEditDistance("", "abc")) + console.log(minimumEditDistance("google", "glgool")) +} + +main() \ No newline at end of file From 2daaf014b8ef349f66b8e5d88abe211c90b901f0 Mon Sep 17 00:00:00 2001 From: vinayak Date: Sun, 4 Oct 2020 19:52:54 +0530 Subject: [PATCH 2/2] Update EditDistance.js --- Dynamic-Programming/EditDistance.js | 56 ++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Dynamic-Programming/EditDistance.js b/Dynamic-Programming/EditDistance.js index b77143e54c..ac554d8b56 100644 --- a/Dynamic-Programming/EditDistance.js +++ b/Dynamic-Programming/EditDistance.js @@ -13,49 +13,49 @@ space complexity - O(n*m) */ const minimumEditDistance = (word1, word2) => { - const n = word1.length - const m = word2.length - const dp = new Array(m + 1).fill(0).map(item => []) + const n = word1.length + const m = word2.length + const dp = new Array(m + 1).fill(0).map(item => []) - /* + /* fill dp matrix with default values - - first row is filled considering no elements in word2. - first column filled considering no elements in word1. */ - for (let i = 0; i < n + 1; i++) { - dp[0][i] = i - } + for (let i = 0; i < n + 1; i++) { + dp[0][i] = i + } - for (let i = 0; i < m + 1; i++) { - dp[i][0] = i - } + for (let i = 0; i < m + 1; i++) { + dp[i][0] = i + } - /* + /* indexing is 1 based for dp matrix as we defined some known values at first row and first column/ */ - for (let i = 1; i < m + 1; i++) { - for (let j = 1; j < n + 1; j++) { - const letter1 = word1[j - 1] - const letter2 = word2[i - 1] - - if (letter1 === letter2) { - dp[i][j] = dp[i - 1][j - 1] - } else { - dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1 - } - } + for (let i = 1; i < m + 1; i++) { + for (let j = 1; j < n + 1; j++) { + const letter1 = word1[j - 1] + const letter2 = word2[i - 1] + + if (letter1 === letter2) { + dp[i][j] = dp[i - 1][j - 1] + } else { + dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1 + } } + } - return dp[m][n] + return dp[m][n] } const main = () => { - console.log(minimumEditDistance("horse", "ros")) - console.log(minimumEditDistance("cat", "cut")) - console.log(minimumEditDistance("", "abc")) - console.log(minimumEditDistance("google", "glgool")) + console.log(minimumEditDistance('horse', 'ros')) + console.log(minimumEditDistance('cat', 'cut')) + console.log(minimumEditDistance('', 'abc')) + console.log(minimumEditDistance('google', 'glgool')) } -main() \ No newline at end of file +main()