算法名称
算法描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23” 输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “” 输出:[]
示例 3:
输入:digits = “2” 输出:[“a”,“b”,“c”]
算法分析
数字和字母的映射: 可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下:
const string letterMap[10] = { "", // 0 "", // 1 "abc", // 2 "def", // 3 "ghi", // 4 "jkl", // 5 "mno", // 6 "pqrs", // 7 "tuv", // 8 "wxyz", // 9 };
用回溯法解决for循环:
从下图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]。
算法解析代码
var letterCombinations = function(digits) { //获取digits的长度 const k = digits.length; //使用map const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]; //digits为空,则输出[] if(!k) return []; //当digits只有一个数字,则通过分割字符串的方式用map获得结果 if(k === 1) return map[digits].split(""); //定义函数 function backtracking(n, k, a) { //当path的长度等于digits的长度,则匹配完毕,添加到res中 if(path.length === k) { res.push(path.join("")); return; } //对digits相对应的数字所包含的字母进行递归添加到path中 for(const v of map[n[a]]) { path.push(v); //进行递归 backtracking(n, k, a + 1); path.pop(); } } const res = [], path = []; //调用函数 backtracking(digits, k, 0); //返回结果 return res; };
算法只有多写多练,我们的算法逻辑和能力才能获得提高,继续fighting✨✨✨
期待获得你们的支持,有更好的想法欢迎评论指出💖💖💖