LC-17. 电话号码的字母组合

215 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

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

image.png

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

题解

1.回溯

关于这道题,看到组合两个字,知道还是一个组合问题,我们这里还是采用回溯法来解决。

  • 首先默认每个数字对应的值,创建一个 defaultArr 数组

  • 由于 digits 是固定的值,所以只需要考虑每次递归时,当前的值的下标对应的str的值

  • 遍历str的值,并进行push操作,判断arr里面的值的长度是否是总长度

    • 如果是,则将arr里面的值进行join操作后,再push到res数组中

    • 否则继续向下遍历

  • 每次push完,遍历后,进行pop弹出操作。

const letterCombinations = (digits) => {
  const res = []

  const defaultArr = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']

  if (!digits) return []

  const digitsArr = digits.split('')
  const digitsLength = digits.length

  const search = (start, arr) => {
    if (arr.length === digitsLength) {
      res.push(arr.join(''))
      return
    }

    const str = defaultArr[digitsArr[start]]
    for (const v of str) {
      arr.push(v)
      search(start + 1, arr)
      arr.pop()
    }
  }

  search(0, [])

  return res
}

2.bfs

回顾一下 bfs,这里也可以用 广度优先遍历 来处理

const letterCombinations = (digits) => {
  const defaultArr = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']

  if (!digits) return []

  let bfs = [''] // 传入默认值

  for (let v of digits) {
    const arr = [...defaultArr[v]]
    const newQueue = []
    while (bfs.length) {
      const val = bfs.shift()
      for (let item of arr) {
        newQueue.push(val + item)
      }
    }
    bfs = newQueue
  }
  return bfs
}

3.dfs

回顾一下 dfs,通过 深度优先遍历

const letterCombinations = (digits) => {
  const defaultArr = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']

  if (!digits) return []

  const digitsLength = digits.length
  const res = []

  const dfs = (str, index) => {
    if (index === digitsLength) {
      res.push(str)
      return
    }

    const arr = [...defaultArr[digits[index]]]

    index++

    for (let item of arr) {
      dfs(str + item, index)
    }
  }

  dfs('', 0)

  return res
}

总结

题目 20 :回溯法非常适用于组合问题,可以很清楚的得到解决。这道题也可以适用 bfs 和 dfs 来解决