17. 电话号码的字母组合

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

标准答案


class Solution {
public:
    //1. 用map记录每个数字按键对应的所有字母
    unordered_map<char, string> M = {
        {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"},
        {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
    };
    //2. 存储最终结果和临时结果的变量
    vector<string> ans;
    string current;

    //3. DFS函数,index是生成临时结果字串的下标,
    //每一个digits[index]数字对应临时结果current[index]的一位字母
    void DFS(int index, string digits) {
        //出口
        if(index == digits.size()) {
            ans.push_back(current);
            return;
        }
        //递归调用
        //对于当前输入的第index号数字(digits[index]),
        //枚举其对应的所有字母(M[digits[index]][i])
        for(int i = 0; i < M[digits[index]].size(); i++) {
            current.push_back(M[digits[index]][i]);     //临时结果压入一个字母
            DFS(index + 1, digits);         //以在当前位置压入该字母这一“情况”为前提,构造此“分支”的后续结果
            current.pop_back();             //状态还原,例如临时结果从 "ab" -> "a",下一次循环尝试"ac" 
        }
    }

    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) {
            return ans;
        }
        DFS(0, digits);
        return ans;
    }

};

我的答案

class Solution {
private:
    void change_res(const char c) {
        tmp.clear();
        if (c == '2') {
            if (res.empty()) {
                tmp.emplace_back("a");
                tmp.emplace_back("b");
                tmp.emplace_back("c");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "a");
                tmp.emplace_back(ss + "b");
                tmp.emplace_back(ss + "c");
            }
        }
        else if (c == '3') {
            if (res.empty()) {
                tmp.emplace_back("d");
                tmp.emplace_back("e");
                tmp.emplace_back("f");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "d");
                tmp.emplace_back(ss + "e");
                tmp.emplace_back(ss + "f");
            }
        }
        else if (c == '4') {
            if (res.empty()) {
                tmp.emplace_back("g");
                tmp.emplace_back("h");
                tmp.emplace_back("i");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "g");
                tmp.emplace_back(ss + "h");
                tmp.emplace_back(ss + "i");
            }
        }
        else if (c == '5') {
            if (res.empty()) {
                tmp.emplace_back("j");
                tmp.emplace_back("k");
                tmp.emplace_back("l");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "j");
                tmp.emplace_back(ss + "k");
                tmp.emplace_back(ss + "l");
            }
        }
        else if (c == '6') {
            if (res.empty()) {
                tmp.emplace_back("m");
                tmp.emplace_back("n");
                tmp.emplace_back("o");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "m");
                tmp.emplace_back(ss + "n");
                tmp.emplace_back(ss + "o");
            }
        }
        else if (c == '7') {
            if (res.empty()) {
                tmp.emplace_back("p");
                tmp.emplace_back("q");
                tmp.emplace_back("r");
                tmp.emplace_back("s");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "p");
                tmp.emplace_back(ss + "q");
                tmp.emplace_back(ss + "r");
                tmp.emplace_back(ss + "s");
            }
        }
        else if (c == '8') {
            if (res.empty()) {
                tmp.emplace_back("t");
                tmp.emplace_back("u");
                tmp.emplace_back("v");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "t");
                tmp.emplace_back(ss + "u");
                tmp.emplace_back(ss + "v");
            }
        }
        else if (c == '9') {
            if (res.empty()) {
                tmp.emplace_back("w");
                tmp.emplace_back("x");
                tmp.emplace_back("y");
                tmp.emplace_back("z");
            }
            for (const auto& ss : res) {
                tmp.emplace_back(ss + "w");
                tmp.emplace_back(ss + "x");
                tmp.emplace_back(ss + "y");
                tmp.emplace_back(ss + "z");
            }
        }
        else {
            return;
        }
        res.clear();
        res = tmp;
    }
    void traversal(string digits, int index) {
        if (index == digits.size()) {
            return;
        }
        const auto integer = digits[index];
        change_res(integer);
        traversal(digits, index + 1);
    }
public:
    vector<string> res;
    vector<string> tmp;
    vector<string> letterCombinations(string digits) {
        traversal(digits, 0);
        return res;
    }
};
posted @   xiazichengxi  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩