mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 16:26:47 +08:00
algorithm: letter combinations (#1209)
This commit is contained in:
@ -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)
|
||||
|
53
Recursive/LetterCombination.js
Normal file
53
Recursive/LetterCombination.js
Normal 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 }
|
48
Recursive/test/LetterCombination.test.js
Normal file
48
Recursive/test/LetterCombination.test.js
Normal 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'
|
||||
])
|
||||
})
|
||||
})
|
Reference in New Issue
Block a user