代码随想录算法训练营第二十五天| 216.组合总和III 17.电话号码的字母组合

组合总和III

题目链接:216. 组合总和 III - 力扣(LeetCode)

思路:仿照昨天的递归模板写的,同样是for循环横向遍历,递归纵向遍历。注意当k>n时要直接跳出,否则会判断栈溢出。

额外发现一个问题就是在累加sum时,用for(auto i:path)sum+=path[i];会出现奇怪数字,原因是auto遍历用法错误,正确写法是for(auto i:path)sum+=i;

class Solution {
public:
    vector<int>path;
    vector<vector<int>>result;
    void backtracking(int k,int n,int startindex){
        if(path.size()==k){
            int sum=0;
            for(int i=0;i<path.size();i++){
                sum+=path[i];
            }
            if(sum==n){
                result.push_back(path);
                return;
            }
        }

        for(int i=startindex;i<=9;i++){
            path.push_back(i);
            backtracking(k,n,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        if(k>n)return result;
        backtracking(k,n,1);
        return result;
    }
};

电话号码的字母组合

题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)

思路:注意一个字符串s="12"的话,s.size()结果就是2。同时用str.pop_back()可以快速删除字符串的最后一个字符。原理是和上一题相似,只是先建立一个字符映射库,当遍历到某个数字后便开始遍历对应的字母库,只是比上一层多嵌套一个for循环。

没想到是一遍过!

class Solution {
public:
    vector<string>result;
    vector<string>k={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    string tmp;
    void backtracking(string digits,int start){
        if(tmp.size()==digits.size()){
            result.push_back(tmp);
            return;
        }

        for(int i=start;i<digits.size();i++){
            for(int j=0;j<k[digits[i]-50].size();j++){
                tmp+=k[digits[i]-50][j];
                backtracking(digits,i+1);
                tmp.pop_back();
            }
        }
    }
    vector<string> letterCombinations(string digits) {
        if(!digits.size())return result;
        backtracking(digits,0);
        return result;
    }
};

官网这种写法也是值得借鉴的

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

    void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {
        if (index == digits.length()) {
            combinations.push_back(combination);
        } else {
            char digit = digits[index];
            const string& letters = phoneMap.at(digit);
            for (const char& letter: letters) {
                combination.push_back(letter);
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.pop_back();
            }
        }
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solutions/388738/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2024-02-22 18:27  SandaiYoung  阅读(18)  评论(0编辑  收藏  举报