Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列相关的知识,希望对你有一定的参考价值。

我是小张同学,立志用最简洁的代码做最高效的表达


以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!

传送门——>Leecode大厂热题100道系列题解


问题描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例 2:
输入:digits = “”
输出:[]

示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。


核心思路:dfs模拟全排列。

有一个小技巧:将变量都设置为全局变量,可以避免递归时传递参数造成的高耗时。


class Solution {
public:
    vector<string> res;                         // 存放结果的数组
    string temp;
    unordered_map<char, string> phoneMap{       // 映射数组
            {'2', "abc"},
            {'3', "def"},
            {'4', "ghi"},
            {'5', "jkl"},
            {'6', "mno"},
            {'7', "pqrs"},
            {'8', "tuv"},
            {'9', "wxyz"}
    };
    vector<string> letterCombinations(string digits) {
        if (digits.empty()) {
            return res;
        }
        dfs(digits, 0);
        return res;
    }

    // 回溯
    void dfs(string digits, int step) {
        if (step == digits.size()) {
            res.push_back(temp);
            return;
        }
        char digit = digits[step];
        string letters = phoneMap[digit];
        for(auto letter : letters) {
            temp.push_back(letter);
            dfs(digits, step + 1);
            temp.pop_back();
        }
    }
};

以上是关于Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列的主要内容,如果未能解决你的问题,请参考以下文章

Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列

17. 电话号码的字母组合

17. 电话号码的字母组合

17. 电话号码的字母组合回溯Normal

LeetCode 第17题电话号码的字母组合

17-电话号码的字母组合