给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    1. const map = {
    2. 2: 'abc',
    3. 3: 'def',
    4. 4: 'ghi',
    5. 5: 'jkl',
    6. 6: 'mno',
    7. 7: 'pqrs',
    8. 8: 'tuv',
    9. 9: 'wxyz',
    10. }
    /**
     * 回溯 + dfs
     * 时间复杂度:O(n^4)
     * 空间复杂度:O(n)
     */
    var letterCombinations = function (digits) {
      if (!digits || !digits.length) return []
      const map = {
        2: 'abc',
        3: 'def',
        4: 'ghi',
        5: 'jkl',
        6: 'mno',
        7: 'pqrs',
        8: 'tuv',
        9: 'wxyz',
      }
      const res = []
      function dfs(str, i) {
        if (i > digits.length - 1) {
          res.push(str)
          return
        }
        const letters = map[digits[i]]
        for (const letter of letters) {
          dfs(str + letter, i + 1)
        }
      }
      dfs('', 0)
      return res
    }
    
    /**
     * 回溯 + bfs
     * 时间复杂度:O(3^m×4^n)
     * 空间复杂度:O(m+n)
     */
    var letterCombinations = function (digits) {
      if (!digits || !digits.length) return []
      const map = {
        2: 'abc',
        3: 'def',
        4: 'ghi',
        5: 'jkl',
        6: 'mno',
        7: 'pqrs',
        8: 'tuv',
        9: 'wxyz',
      }
      const queue = ['']
      for (let i = 0; i < digits.length; i++) {
        const size = queue.length
        for (let j = 0; j < size; j++) {
          const str = queue.shift()
          const letters = map[digits[i]]
          for (const letter of letters) {
            queue.push(str + letter)
          }
        }
      }
      return queue
    }