给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
思路:
从示例1很容易看出用两个for循环,一个是先前数组的循环,一个是新字母的循环,比如“23”,先前数组就是“2”对应的[‘a’, ‘b’, ‘c’],新字母要进行和先前的组合,即"3"对应的[‘d’, ‘e’, ‘f’]如果是’234’,那么要进行1的操作之后,先前数组就变成了’23’对应的[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”],新字母要进行和先前的组合,即"4"对应的[‘g’, ‘h’, ‘i’]很容易想到要用递归方法,不断更新先前数组为最新组合成的数组,而且不停地找到新的字母,还有新字母对应的数组,新字母主要由下标更新容易犯错的点,边界问题:输入字符串长度为0或1的情况,以及到了最后一个字母的情况 const obj = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz' } const repeatCombind = function (digits, r1, count) { let r2 = obj[digits[count]].split('') let result = [] for (let i = 0; i < r1.length; i++) { for (let j = 0; j < r2.length; j++) { result.push(`${r1[i]}${r2[j]}`) } } count++ if (count < digits.length) { return repeatCombind(digits, result, count) } else { return result } } const letterCombinations = function(digits) { if (digits.length === 0) { return [] } if (digits.length === 1) { return obj[digits[0]].split('') } let count = 1 let r1 = [] let firstStrs = obj[digits[0]] return repeatCombind(digits, firstStrs.split(''), count) }