电话号码的字母组合
给定一个仅包含数字 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']
的一个数字。
JavaScript 的函数执行机制
-
函数会一直执行到遇见
return
或执行完所有语句 -
没有
return
的函数默认返回undefined
-
在递归中,不恰当的继续执行会导致调用栈堆积
参数详解:
1.index
参数
作用:表示当前正在处理输入数字字符串中的第几个数字,从0开始计数
2.current
参数
作用:累积当前已生成的字母组合字符串
思考:
Q:为什么不用 for...in
?
A:for...in
用于遍历对象属性,字符串遍历应用 for...of
代码实现:
/*** @param {string} digits* @return {string[]}*/
var letterCombinations = function (digits) {// 处理空输入情况if (digits.length === 0) {return [];}// 数字字母映射表const digitToLetters = {'2': 'abc','3': 'def','4': 'ghi','5': 'jkl','6': 'mno','7': 'pqrs','8': 'tuv','9': 'wxyz'};const result = [];// 定义回溯函数,递归生成所有组合function backtrack(index, current) {// 当处理完所有数字时终止if (index === digits.length) {result.push(current);return; // 结束当前递归分支}// 获取的数字对应的字母字符串const letters = digitToLetters[digits[index]];// 遍历当前数字对应的每个字母for (const letter of letters) {// 递归调用,处理下一个数字,并将当前字母添加到组合中backtrack(index + 1, current + letter);}}// 调用回溯函数:从第0个数字和空字符串开始backtrack(0, '');return result;
};