力扣 17 电话号码的字母组合

力扣 17 电话号码的字母组合

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:17. 电话号码的字母组合


考查知识点

回溯三步法、字符串到字母的映射


自己的第一遍解法

同样是使用【算法套路】-【回溯篇】【回溯三步法】中提到的回溯三步法

但是刚开始使用了unordered_map来进行数字->字母的映射,所以略显麻烦,看到【代码随想录】大佬的题解回溯算法:电话号码的字母组合,原来可以使用string数组来代替unordered_map

好的解法

1、首先就是数字与字母的映射关系

const string letterMap[10] = {
    
    
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
};

2、其次就是回溯三步法

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
    };
    vector<string> result;
    string path;
    void backTracking (const string& digits, int index) {
    
    
        /*
         * index: 当前的数字*/

        if (index == digits.size()) {
    
    
            result.push_back(path);
            return;
        }

        int digit = digits[index] - '0'; //将当前字符形式的数字转为整型
        string letters = letterMap[digit]; //取当前数字对应的字母字符串
        for (char letter : letters) {
    
    
            path.push_back(letter);
            backTracking(digits, index + 1);
            path.pop_back();
        }
    }
public:
    vector<string> letterCombinations (string digits) {
    
    
        path.clear();
        result.clear();
        if (digits.empty())   return result;

        backTracking(digits, 0);
        return result;
    }
};

注意路径记录语句result.push_back(path);这一句其实发生在最后一次路径改变语句path.push_back(letter);之后

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/113727008
今日推荐