题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:

       (这里不好用),还是用数组映射,因为这里的映射表是个静态的

        组合的思想。比如2,3就是需要选两个字母即搜索树的深度k=2。不同的是组合中是在同一组数中选,现在是在两个序列中分别选择。

        发现循环次数不是固定的,也就是回溯解决的问题,还得用回溯。17. 电话号码的字母组合-LMLPHP

我的代码:

        敲完总感觉哪里有问题,结果竟然一遍过了

class Solution {
private:
    const string letterMap[10] = {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
};
public:
    std::vector<string> result;
    string res;
    vector<string> letterCombinations(string digits) {
        if(digits == "") return {};
        comb(digits, digits.size(), 0);
        return result;
    }
    
    //第一步确定参数,k是深度也就是结果字串的长度,index是递归到第几个数字
    void comb(string digits, int k, int index)
    {
        if(res.size() == k)//第二部返回条件
        {
            result.push_back(res);
            return;
        }

        //第二步一次循环
        int num = digits[index] - '0';//确定映射表数字
        for(int i = 0; i < letterMap[num].size(); i++)
        {
            res.push_back(letterMap[num][i]);
            comb(digits, k, index+1);//下一层
            res.pop_back();
        }

    }
};

 随想录代码:

// 版本一
class Solution {
private:
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
public:
    vector<string> result;
    string s;
    void backtracking(const string& digits, int index) {
        if (index == digits.size()) {
            result.push_back(s);
            return;
        }
        int digit = digits[index] - '0';        // 将index指向的数字转为int
        string letters = letterMap[digit];      // 取数字对应的字符集
        for (int i = 0; i < letters.size(); i++) {
            s.push_back(letters[i]);            // 处理
            backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了
            s.pop_back();                       // 回溯
        }
    }
    vector<string> letterCombinations(string digits) {
        s.clear();
        result.clear();
        if (digits.size() == 0) {
            return result;
        }
        backtracking(digits, 0);
        return result;
    }
};
09-18 23:18