57.电话号码的字母组合

113 阅读1分钟

题目链接

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

解法 dfs回溯

思路

先思考递归结束条件,什么时候会结束呢,就是到 digits 最后一位长度的的时候,index 指的就是当前电话号码的索引,从 0 开始。

接下来遍历当前电话号码上的按键,加入 path ,接下来递归下一位,然后回溯。

代码

function letterCombinations(digits: string): string[] {
    const numberMap = {
        "2": "abc",
        "3": "def",
        "4": "ghi",
        "5": "jkl",
        "6": "mno",
        "7": "pqrs",
        "8": "tuv",
        "9": "wxyz"
    };

    const result = [];
    if (!digits.length) return result;
    const n = digits.length;
    const dfs = (path, index) => {
        if (index === n) {
            result.push(path.join(""));
            return;
        }

        const str = numberMap[digits[index]];
        for (let char of str) {
            path.push(char);
            dfs(path, index + 1);
            path.pop();
        }
    };

    dfs([], 0);
    return result;
};

时空复杂度

时间复杂度:O(k^n) k 是每个按键的可能,最坏为 4

空间复杂度:O(n * k^n) 递归 n 层,数组存储了 O(k^n) 字符串