mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-06 17:50:39 +08:00
algorithm: letter combinations (#1209)
This commit is contained in:
@ -252,6 +252,7 @@
|
|||||||
* [FibonacciNumberRecursive](Recursive/FibonacciNumberRecursive.js)
|
* [FibonacciNumberRecursive](Recursive/FibonacciNumberRecursive.js)
|
||||||
* [FloodFill](Recursive/FloodFill.js)
|
* [FloodFill](Recursive/FloodFill.js)
|
||||||
* [KochSnowflake](Recursive/KochSnowflake.js)
|
* [KochSnowflake](Recursive/KochSnowflake.js)
|
||||||
|
* [LetterCombination](Recursive/LetterCombination.js)
|
||||||
* [Palindrome](Recursive/Palindrome.js)
|
* [Palindrome](Recursive/Palindrome.js)
|
||||||
* [SubsequenceRecursive](Recursive/SubsequenceRecursive.js)
|
* [SubsequenceRecursive](Recursive/SubsequenceRecursive.js)
|
||||||
* [TowerOfHanoi](Recursive/TowerOfHanoi.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