algorithm: letter combinations (#1209)

This commit is contained in:
Hitesh Gupta
2022-10-21 07:24:37 -04:00
committed by GitHub
parent ce9e2946be
commit 63a3394d95
3 changed files with 102 additions and 0 deletions

View File

@ -252,6 +252,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)

View File

@ -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 }

View File

@ -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'
])
})
})