diff --git a/DIRECTORY.md b/DIRECTORY.md index e1bbd77000..cc86916bab 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -251,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/Recursive/LetterCombination.js b/Recursive/LetterCombination.js new file mode 100644 index 0000000000..5131ebd857 --- /dev/null +++ b/Recursive/LetterCombination.js @@ -0,0 +1,53 @@ +/* + * + * 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) => { + const length = digits?.length + const result = [] + if (!length) { + return result + } + const digitMap = { + 2: 'abc', + 3: 'def', + 4: 'ghi', + 5: 'jkl', + 6: 'mno', + 7: 'pqrs', + 8: 'tuv', + 9: 'wxyz' + } + + const combinations = (index, combination) => { + let letter + let letterIndex + if (index >= length) { + result.push(combination) + return + } + const digit = digitMap[digits[index]] + letterIndex = 0 + while ((letter = digit[letterIndex++])) { + combinations(index + 1, combination + letter) + } + } + combinations(0, '') + return result +} + +export { letterCombinations } diff --git a/Recursive/test/LetterCombination.test.js b/Recursive/test/LetterCombination.test.js new file mode 100644 index 0000000000..29631b8f47 --- /dev/null +++ b/Recursive/test/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' + ]) + }) +})