代码随想录算法训练营第二十五天 | 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;
    }
};
相关推荐
CryptoPP14 分钟前
开发者指南:构建实时期货黄金数据监控系统
大数据·数据结构·笔记·金融·区块链
爱丽_21 分钟前
ThreadLocal 机制:弱引用 Entry、内存泄漏、线程池复用与线上排查
java·jvm·算法
2301_8154829329 分钟前
C++编译期矩阵运算
开发语言·c++·算法
liulilittle30 分钟前
LINUX RING BUFFER TUN/TAP 1
linux·服务器·网络·c++·信息与通信·通信
☆56634 分钟前
C++中的类型擦除技术
开发语言·c++·算法
m0_5698814740 分钟前
C++与自动驾驶系统
开发语言·c++·算法
2401_833197731 小时前
C++代码切片分析
开发语言·c++·算法
月落归舟1 小时前
每日算法题 14---14.环形链表
数据结构·算法·链表
m0_621438521 小时前
实时音频处理C++实现
开发语言·c++·算法
weixin_421922691 小时前
模板代码性能测试
开发语言·c++·算法