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

分段排列,有点像乘法原理,各个区间的顺序确定,但是区间的内部元素不确定,针对各个区间回溯,区间之间相互独立

cpp 复制代码
class Solution {
public:
    vector<string> res;
    string resStr;
    vector<string> chooseList;
    void resInit(){
        for(int i = 0;i< 10;i++){
            string chooseStr ="";
            switch(i){
                case 2:{
                    chooseStr = "abc";
                    break;
                }
                case 3:{
                    chooseStr = "def";
                     break;
                }
                case 4:{
                    chooseStr = "ghi";
                     break;
                }
                case 5:{
                    chooseStr = "jkl";
                    break;
                }
                case 6:{
                    chooseStr = "mno";
                     break;
                }
                case 7:{
                    chooseStr = "pqrs";
                     break;
                }
                 case 8:{
                    chooseStr = "tuv";
                     break;
                }
                case 9:{
                    chooseStr = "wxyz";
                     break;
                }
                default:
                     break;
            }

            chooseList.push_back(chooseStr);
        }
    }
    bool isValid();
    void traceback(string resStr,string & digits,int seq){

        if(resStr.size() == digits.size()){
           res.push_back(resStr);
           return;
        }

        for(auto j : chooseList[(digits[seq] -'0')]){
              resStr.push_back(j);
              traceback(resStr,digits,seq+1);
              resStr.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        resInit();
        if(digits == ""){
            return res;
        }
        traceback(resStr,digits,0);
        return res;
    }
};


无重组合,不可复取

cpp 复制代码
class Solution {  
public:
    vector<vector<int>> res;
    vector<int> resVec;
    vector<int> chooseList;
    void resInit(){
        for(int i =0;i< 9;i++){
            chooseList.push_back(i+1);
        }
    }
    bool isValid();
    void traceback(vector<int> resVec,vector<int> &chooseList,int &n,int &k,int sum,int start){
        if(k == resVec.size()){
            if(sum == n){
                res.push_back(resVec);
            }
            return;
        }
        
        for(int i =start;i< chooseList.size();i++){
            resVec.push_back(chooseList[i]);
            traceback(resVec,chooseList,n,k,sum+chooseList[i],i+1);
            resVec.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
           resInit();
            traceback(resVec,chooseList,n,k,0,0);
           return res;
    }
};
相关推荐
小赵起名困难户2 小时前
蓝桥杯备赛1-2合法日期
算法
shichaog2 小时前
腿足机器人之八- 腿足机器人动力学
算法·机器人
悄悄敲敲敲4 小时前
C++:dfs习题四则
c++·算法·深度优先
安於宿命5 小时前
【Linux】进程间通信——进程池
linux·c++
牛大了20235 小时前
[LeetCode力扣hot100]-二叉树相关手撕题
算法·leetcode·职场和发展
ll7788115 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
德先生&赛先生5 小时前
LeetCode-633. 平方数之和
数据结构·算法·leetcode
coding_rui7 小时前
链表(C语言版)
c语言·数据结构·链表
coding_rui8 小时前
哈希表(C语言版)
c语言·数据结构·散列表
coding_rui8 小时前
二叉树(C语言版)
c语言·数据结构