电话号码的字母组合的


class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string>res;
        map<int,string>mp;
        mp[2]="abc";
        mp[3]="def";
        mp[4]="ghi";
        mp[5]="jkl";
        mp[6]="mno";
        mp[7]="pqrs";
        mp[8]="tuv";
        mp[9]="wxyz";
        if(digits.size()==1){
            for(int i=0;i<mp[digits[0]].size();i++)
            res[i]=mp[digits[0]][i];
            return res;
        }
        for(int i=0;i<digits.size()-1;i++){
            for(int j=i+1;j<digits.size();j++){
                for(int k=0;k<mp[digits[i]].size();k++){
                    for(int l=0;l<mp[digits[j]].size();l++){
                        string str="";
                        str+=mp[digits[i]][k];
                        str+=mp[digits[j]][l];
                        res.push_back(str);
                    }
                }
            }
        }
        return res;
    }
};

为什么输出为空?
题目https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

方法问题,最后回溯做

  • 您可有对类实例化?就相当于函数调用。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 文章:LeetCode 最热 100 题,电话号码的字母组合,letter combinations of a phone number 中也许有你想要的答案,请看下吧
  • 以下回答由chatgpt基于相关博客总结生成:

    这段代码的输出为空是因为在处理长度大于等于2的数字字符串时,没有考虑到生成的组合不只有两个字符的情况。

    以下是对该代码的优化方案:

    class Solution {
    public:
        vector<string> letterCombinations(string digits) {
            vector<string> res;
            map<char, string> mp;
            mp['2'] = "abc";
            mp['3'] = "def";
            mp['4'] = "ghi";
            mp['5'] = "jkl";
            mp['6'] = "mno";
            mp['7'] = "pqrs";
            mp['8'] = "tuv";
            mp['9'] = "wxyz";
            if(digits.size() == 0){
                return res;
            }
            backtrack(digits, mp, res, "", 0);
            return res;
        }
    
        void backtrack(string digits, map<char, string>& mp, vector<string>& res, string curr, int index){
            if(index == digits.size()){
                res.push_back(curr);
                return;
            }
            string letters = mp[digits[index]];
            for(int i=0; i<letters.size(); i++){
                curr += letters[i];
                backtrack(digits, mp, res, curr, index+1);
                curr.pop_back();
            }
        }
    };
    

    优化后的代码使用回溯法来生成所有可能的组合,每次将一个数字对应的所有字母组合添加到当前结果中,然后递归地处理下一个数字。当处理完所有数字后,将当前结果添加到最终结果中。

    代码的优化点如下: 1. 将数字映射表的类型改为map<char, string>,以便根据数字字符获取相应的字母字符串。 2. 使用递归回溯的方式生成所有可能的组合。 3. 将digits.size() == 1的情况合并到主函数中,避免重复处理。

    优化后的代码对于任意长度的数字字符串都能正确输出字母组合。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^