From a7063c19d9b6048b96e1dd1393019bc17eb61d7f Mon Sep 17 00:00:00 2001 From: hiitesh1127 Date: Tue, 18 Oct 2022 18:16:55 -0400 Subject: [PATCH 1/4] Added-program-for-letter-combination --- Backtracking/LetterCombination.js | 54 ++++++++++++++++++++ Backtracking/tests/LetterCombination.test.js | 48 +++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 Backtracking/LetterCombination.js create mode 100644 Backtracking/tests/LetterCombination.test.js diff --git a/Backtracking/LetterCombination.js b/Backtracking/LetterCombination.js new file mode 100644 index 0000000000..4e93b55b9e --- /dev/null +++ b/Backtracking/LetterCombination.js @@ -0,0 +1,54 @@ +/* + * + * Letter Combinations of a Phone Number + * + * Given a string containing digits from 2-9 inclusive, + * return all possible letter combinations that the number could represent. + * Return the answer in any order. + + * A mapping of digits to letters (just like on the telephone buttons) is given below. + * Note that 1 does not map to any letters. + * More info: https://leetcode.com/problems/letter-combinations-of-a-phone-number/ + */ + +/* + * @param {string} digits + * @returns {string[]} all the possible combinations + */ + +const letterCombinations = (digits) => { + let length = digits?.length + let result = [] + if (!length) { + return result + } + let digitMap = { + 2: 'abc', + 3: 'def', + 4: 'ghi', + 5: 'jkl', + 6: 'mno', + 7: 'pqrs', + 8: 'tuv', + 9: 'wxyz' + } + + const combinations = (index, combination) => { + let digit + let letter + let letterIndex + if (index >= length) { + result.push(combination) + return + } + digit = digitMap[digits[index]] + letterIndex = 0 + while ((letter = digit[letterIndex++])) { + combinations(index + 1, combination + letter) + } + } + combinations(0, '') + return result +} + +export { letterCombinations } diff --git a/Backtracking/tests/LetterCombination.test.js b/Backtracking/tests/LetterCombination.test.js new file mode 100644 index 0000000000..29631b8f47 --- /dev/null +++ b/Backtracking/tests/LetterCombination.test.js @@ -0,0 +1,48 @@ +import { letterCombinations } from '../LetterCombination' + +describe('Letter Combinations', () => { + it('should return empty array if provided string is not valid', () => { + const result = letterCombinations('') + expect(Array.isArray(result)).toBe(true) + expect(result.length).toBe(0) + }) + + it('should return empty array if provided string is empty', () => { + const result = letterCombinations(null) + expect(Array.isArray(result)).toBe(true) + expect(result.length).toBe(0) + }) + + it('should return letter combination of 234', () => { + const result = letterCombinations('234') + expect(result).toEqual([ + 'adg', + 'adh', + 'adi', + 'aeg', + 'aeh', + 'aei', + 'afg', + 'afh', + 'afi', + 'bdg', + 'bdh', + 'bdi', + 'beg', + 'beh', + 'bei', + 'bfg', + 'bfh', + 'bfi', + 'cdg', + 'cdh', + 'cdi', + 'ceg', + 'ceh', + 'cei', + 'cfg', + 'cfh', + 'cfi' + ]) + }) +}) From 96b60ef122b2d01a20826a5b6662007bfbb410d3 Mon Sep 17 00:00:00 2001 From: hiitesh1127 Date: Tue, 18 Oct 2022 18:18:04 -0400 Subject: [PATCH 2/4] fix-to-stardard-format --- Backtracking/LetterCombination.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Backtracking/LetterCombination.js b/Backtracking/LetterCombination.js index 4e93b55b9e..5131ebd857 100644 --- a/Backtracking/LetterCombination.js +++ b/Backtracking/LetterCombination.js @@ -17,12 +17,12 @@ */ const letterCombinations = (digits) => { - let length = digits?.length - let result = [] + const length = digits?.length + const result = [] if (!length) { return result } - let digitMap = { + const digitMap = { 2: 'abc', 3: 'def', 4: 'ghi', @@ -34,14 +34,13 @@ const letterCombinations = (digits) => { } const combinations = (index, combination) => { - let digit let letter let letterIndex if (index >= length) { result.push(combination) return } - digit = digitMap[digits[index]] + const digit = digitMap[digits[index]] letterIndex = 0 while ((letter = digit[letterIndex++])) { combinations(index + 1, combination + letter) From aa5efc66e2e064b5b5c756022c28ea9faae89506 Mon Sep 17 00:00:00 2001 From: hiitesh1127 Date: Wed, 19 Oct 2022 03:13:57 -0400 Subject: [PATCH 3/4] update Directory.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index e1bbd77000..85a21a3cc4 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -2,6 +2,7 @@ * [AllCombinationsOfSizeK](Backtracking/AllCombinationsOfSizeK.js) * [GeneratePermutations](Backtracking/GeneratePermutations.js) * [KnightTour](Backtracking/KnightTour.js) + * [LetterCombination](Backtracking/LetterCombination.js) * [NQueens](Backtracking/NQueens.js) * [RatInAMaze](Backtracking/RatInAMaze.js) * [Sudoku](Backtracking/Sudoku.js) From 9b7f2a93b1285fe65219c835f881ec363be0bc26 Mon Sep 17 00:00:00 2001 From: hiitesh1127 Date: Thu, 20 Oct 2022 16:45:37 -0400 Subject: [PATCH 4/4] suggested changes --- DIRECTORY.md | 2 +- {Backtracking => Recursive}/LetterCombination.js | 0 .../tests => Recursive/test}/LetterCombination.test.js | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename {Backtracking => Recursive}/LetterCombination.js (100%) rename {Backtracking/tests => Recursive/test}/LetterCombination.test.js (100%) diff --git a/DIRECTORY.md b/DIRECTORY.md index 85a21a3cc4..cc86916bab 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -2,7 +2,6 @@ * [AllCombinationsOfSizeK](Backtracking/AllCombinationsOfSizeK.js) * [GeneratePermutations](Backtracking/GeneratePermutations.js) * [KnightTour](Backtracking/KnightTour.js) - * [LetterCombination](Backtracking/LetterCombination.js) * [NQueens](Backtracking/NQueens.js) * [RatInAMaze](Backtracking/RatInAMaze.js) * [Sudoku](Backtracking/Sudoku.js) @@ -252,6 +251,7 @@ * [FibonacciNumberRecursive](Recursive/FibonacciNumberRecursive.js) * [FloodFill](Recursive/FloodFill.js) * [KochSnowflake](Recursive/KochSnowflake.js) + * [LetterCombination](Recursive/LetterCombination.js) * [Palindrome](Recursive/Palindrome.js) * [SubsequenceRecursive](Recursive/SubsequenceRecursive.js) * [TowerOfHanoi](Recursive/TowerOfHanoi.js) diff --git a/Backtracking/LetterCombination.js b/Recursive/LetterCombination.js similarity index 100% rename from Backtracking/LetterCombination.js rename to Recursive/LetterCombination.js diff --git a/Backtracking/tests/LetterCombination.test.js b/Recursive/test/LetterCombination.test.js similarity index 100% rename from Backtracking/tests/LetterCombination.test.js rename to Recursive/test/LetterCombination.test.js