Skip to content

Latest commit

 

History

History
99 lines (86 loc) · 1.81 KB

回溯-17. 电话号码的字母组合.md

File metadata and controls

99 lines (86 loc) · 1.81 KB

17. 电话号码的字母组合

LeetCode | 17. 电话号码的字母组合 | 中等

给定一个仅包含数字  2-9  的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

回溯 + dfs

/**
 * 回溯 + 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

/**
 * 回溯 + 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
}