第二十五题 17. 电话号码的字母组合

17. 电话号码的字母组合

题目描述

给定一个仅包含数字 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 <= 4
  • digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

思路

回溯+dfs

  • 首先需要解决一个问题 :数字与字母进行映射
    let zm = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];

  • 其次是找出终止条件 填入不同示例 在测试样例中可以知道
    输出组合的字符串元素的长度是等于输入字符串的长度的
    所以:
    定义 temp 数组存放字母元素
    终止条件 temp的长度 === digits的长度 即是一种组合
  • 遍历: 逐个取出 digits 的数字 通过映射找到对应的 字母 push 进 temp 数组
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    let len = digits.length;
    if(!len) return [];
    //数字与字母的映射
    let zm = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
    //输入的字符串数字只有一个时 直接返回 分割后的映射
    if(len === 1) return zm[digits].split("");
    let temp = [];
    let result = [];
    let backTracking = function (digits, len, index){
    //终止条件:temp长度 ===  digits的长度 为一种组合
        if(temp.length === len){
            result.push(temp.join(""));
            return;
        }
        //遍历 根据映射取出对应字母
        //例如: digits = "23"时
        //第一次遍历 index = 2 取得 i = 'a' -> temp=["a"]
        //递归 index = 3 取得 i = 'd' -> temp=["a","b"] 
        for (let i of zm [digits[index]]){
            temp.push(i);
            backTracking(digits, len, index + 1);
            temp.pop();
        }
    }
    backTracking(digits, len, 0);
    return result;

}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值