Letter Combination

/*
 *
 *  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 }