Skip to content

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

上次更新于: