Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入: digits = ""
输出: []
示例 3:
输入: digits = "2"
输出: ["a","b","c"]
提示:
0 <= digits.length <= 4digits[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 来解决