力扣题目解析--电话号码的字母组成

题目

给定一个仅包含数字 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'] 的一个数字。

代码展示 

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        string combination;
        vector<string>result;
        if (digits.empty()) {
            return {};
        }
        unordered_map<char, string> numberMap = {
            {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"},
            {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
        };
        getcharVlaue(digits,0,numberMap,combination,result);
        return result;

    }
    private:
    void getcharVlaue(const string &digits,int index,unordered_map<char,string>&numberMap,string &combination,vector<string>&result){
        if(index==digits.size()){
            result.push_back(combination);
            return;
        }
        char digit=digits[index];
        const string &letters=numberMap[digit];

        for(char letter:letters){
            combination.push_back(letter);
            getcharVlaue(digits,index+1,numberMap,combination,result);
            combination.pop_back();
        }
    }
};

写者心得 

 这段代码里面我觉得最核心的一个点就是嵌套的调用,也就是在定义函数的过程中,在函数的定义里使用定义的函数,这段代码里还有几个亮点是其中比较有精髓的地方:

1.const string & letters=numverMap[digit];这一步没有使用任何使用循环和条件,但是却达到了遍历每一个字符串的目的。

2.getcharVlaue(digits,index+1,numberMap,combination,result);(呃,就是嵌套调用的步骤,其中定义了一个字符串的位置index+1,每一次调用都会把次数加一)

3.combination.pop_back();(因为我们所要得到的是每一个小的字符串。所以就需要把这个使用的这个存储每个字符串地方,给他清空。)

代码的逐行解释

  1. 初始化变量

        string combination; // 用于存储当前的字母组合
        vector<string> result; // 用于存储所有可能的字母组合
  2. 检查输入是否为空

        if (digits.empty()) {
            return {}; // 如果输入字符串为空,直接返回空的 vector
        }
  3. 定义映射表

        unordered_map<char, string> numberMap = {
            {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"},
            {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
        };
  4. 调用辅助函数

        getcharVlaue(digits, 0, numberMap, combination, result);
  5. 返回结果

        return result;
  6. 私有成员函数

    private:
        void getcharVlaue(const string &digits, int index, unordered_map<char, string>& numberMap, string &combination, vector<string>& result) {
  7. 检查是否到达字符串末尾

        if (index == digits.size()) {
            result.push_back(combination); // 将当前组合添加到结果中
            return; // 结束当前递归分支
        }
  8. 获取当前数字字符

        char digit = digits[index];
  9. 获取当前数字字符对应的字母字符串

       const string &letters = numberMap[digit];
  10. 遍历当前数字字符对应的每个字母

       for (char letter : letters) {
           combination.push_back(letter); // 将当前字母添加到当前组合中
           getcharVlaue(digits, index + 1, numberMap, combination, result); // 递归处理下一个数字字符
           combination.pop_back(); // 回溯,移除最后一个字母,继续尝试其他字母
       }

总结

  1. 初始化变量:定义了 combination 用于存储当前的字母组合,result 用于存储所有可能的字母组合。
  2. 检查输入:如果输入字符串为空,直接返回空的 vector
  3. 定义映射表:使用 unordered_map 将每个数字字符映射到其对应的字母字符串。
  4. 调用辅助函数:递归地生成所有可能的字母组合。
  5. 递归条件:当当前索引 index 达到输入字符串的长度时,将当前组合添加到结果中并结束当前递归分支。
  6. 回溯:在每次递归调用后,移除最后一个字母,继续尝试其他字母。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值