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;
};