Leetcode 17. 电话号码的字母组合

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

1.题目

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

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

示例 1:

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

2.思路

本题需要我们将数字中的字母继续排列组合然后将结果返回,那我们就可以考虑通过排列组合的方式来解决问题,我们可以将整个组合想象成树状的结构体,从给的的数字中的第一个数字的每一个字母作为一颗单独的树,然后将后续的每一个数字的字母作为子节点,递归处理每一个数字的字母,最后生成了一颗多叉树,他的每一条路径就是一种组合。

首先我们需要将数字与字母的映射保存起来,然后开始进行排列,首先是初始值空字符串以及下标0,然后在递归中先判断当前组合长度是否已经达到传入数字的长度,如果满足了就直接添加,不满足再继续进行递归,获取到当前递归到哪一个数字,然后循环遍历当前数字的对应字母,然后将添加后的字符串和下一位数字作为递归的参数继续传入函数调用。

3.代码

 let obj = {
        2:['a','b','c'],
        3:['d','e','f'],
        4:['g','h','i'],
        5:['j','k','l'],
        6:['m','n','o'],
        7:['p','q','r','s'],
        8:['t','u','v'],
        9:['w','x','y','z']
    }
var letterCombinations = function(digits) {
    if(digits.length===0)return []
    let res = []
    let deep = (item,index)=>{
        if(item.length===digits.length){
            res.push(item)
            return 
        }
            obj[digits[index]].forEach((el,i)=>{
                deep(item+el,index+1)
            })
    }
    deep('',0)
    return res
};