17 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
# 题解
假设我们输入的数字是389,那么我们处理的逻辑是先看数字3,对应数字3可能得结果是d,e,f。然后递归处理8,可能得结果是tuv,最后是9,可能得结果是wxyz。
那么对应递归的一些条件:
1.递归的参数 原始digits, currentResults, currentIndex 2.递归的终止条件 currentResults.length === digits.length 3.递归的单层逻辑
javascript
//假设递归的函数是getCombinations,参数是 digits, currentResults, currentIndex
const currentNumber = digits[currentIndex]
const currentLetters = getLetters(currentNumber) //通过数字拿可以选的letters,比如2-> abc
for(let i=0;i<currentLetters.length;i++) {
getCombinations(digits, [...currentResults, currentLetters[i]], currentIndex+1)
}
那么整体上的解决方案:
javascript
var letterCombinations = function(digits) {
var map = new Map([
['2', ['a','b','c']],
['3', ['d','e','f']],
['4', ['g','h','i']],
['5', ['j','k', 'l']],
['6', ['m','n','o']],
['7', ['p','q','r','s']],
['8', ['t','u','v']],
['9', ['w','x','y','z']]
])
if(digits === '') {
return []
}
const allResults = []
var letterComb = function(digits, currentResult, index) {
if(currentResult.length === digits.length) {
allResults.push(currentResult.join(''))
return
}
const currentLetter = digits[index]
const actualLetterOptions = map.get(currentLetter)
//console.log('aaa',index, currentLetter, actualLetterOptions)
for(let i=0;i<actualLetterOptions.length;i++) {
letterComb(digits, [...currentResult, actualLetterOptions[i]], index + 1)
}
}
letterComb(digits, [], 0)
//console.log(allResults)
return allResults
};