17. 电话号码的字母组合

问题

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

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

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

输入:digits = ""
输出:[]

输入:digits = "2"
输出:["a","b","c"]

分析

获取除1之外的选择空间,也就是有效选择空间,然后对每个数字对应的字符们,由于选并且只选一个,显然是dfs,每个子问题是当前的数字选哪一个字符,使用for循环控制,然后记录到结果,处理下一个数字对应的字符们。

代码

class Solution {
public:
    int d_n;
    vector<string> v_s;
    vector<string> res;
    void dfs(int x, string temp) {
        if (x >= d_n) {
            if (temp != "") {
                res.push_back(temp);
            }
            return ;
        }
        for (int i = 0; i < v_s[x].size(); i++) {
            dfs(x+1, temp+v_s[x][i]);
        }
    };
    vector<string> letterCombinations(string digits) {
        unordered_map<int, string> um;
        um.insert(make_pair(2, "abc"));
        um.insert(make_pair(3, "def"));
        um.insert(make_pair(4, "ghi"));
        um.insert(make_pair(5, "jkl"));
        um.insert(make_pair(6, "mno"));
        um.insert(make_pair(7, "pqrs"));
        um.insert(make_pair(8, "tuv"));
        um.insert(make_pair(9, "wxyz"));
        for (int i = 0; i < digits.size(); i++) {
            if (digits[i] != '1') {
                d_n++;
                v_s.push_back(um[digits[i]-'0']);
            }
        }
        dfs(0, "");
        return res;
    }
};

posted @ 2025-05-27 19:17  saulstavo  阅读(15)  评论(0)    收藏  举报