【算法25天:Day25】第七章回溯算法 LeetCode 电话号码的字母组合(17)

98 阅读1分钟

题目二:

image.png

解法一:(回溯)

解题思路:主要就是解决数字和字母的映射关系,这个很重要!!!

数字和字母如何映射

可以使用map或者定义一个二维数组来做映射,代码如下:

const letterMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]

整体代码:

var letterCombinations = function(digits) {
    const letterMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
    let result = [] // 存储总结果
    // let str = "" // 存储单个结果
    const backtracking = (digits, index, str) => {
        if (digits.length === 0) return result
        if (index === digits.length) {
            result.push(str)
            return 
        }
        let digit = digits[index] - '0' // 将index指向的数字转为数值型
        let letters = letterMap[digit]
        for (let i = 0; i < letters.length; i++) {
            // str += letters[i]
            backtracking(digits, index + 1, str + letters[i])
            // str.
        }
    }
    backtracking(digits, 0, "")
    return result
};

// 或者

var letterCombinations = function(digits) {
    const k = digits.length;
    const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
    if(!k) return [];
    if(k === 1) return map[digits].split("");

    const res = [], path = [];
    backtracking(digits, k, 0);
    return res;

    function backtracking(n, k, a) {
        if(path.length === k) {
            res.push(path.join(""));
            return;
        }
        for(const v of map[n[a]]) {
            path.push(v);
            backtracking(n, k, a + 1);
            path.pop();
        }

    }
};