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

文章介绍了两种使用回溯算法解决的问题:一是找出所有数字之和为n的k个正整数的组合,限制数字范围为1-9且不允许重复;二是根据电话号码中的数字生成所有可能的字母组合。每种问题都通过构建树形结构辅助理解,并给出了相应的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、组合总和

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

分析如下:

构造树形结构如下图所示:

216.组合总和III

代码如下:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n,int k,int sum,int startIndex)
    {
       if(path.size()==k)
       {
           if(sum==n)
           result.push_back(path);
           return;
       }
       for(int i=startIndex;i<=9;i++)
       {
           sum+=i;//处理
           path.push_back(i);//处理
           backtracking(n,k,sum,i+1);//递归
           sum-=i;//回溯
           path.pop_back();//回溯
       }

    }
    vector<vector<int>> combinationSum3(int k, int n) {
       backtracking(n,k,0,1);
       return result;
    }
};

二、电话号码中的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

分析如下:

例如:输入:"23",抽象为树形结构,如图所示:

17. 电话号码的字母组合

代码如下:

class Solution {
public:
    string lettermap[10]=
    {
       "",
       "",
       "abc",
       "def",
       "ghi",
       "jkl",
       "mno",
       "pqrs",
       "tuv",
       "wxyz"
    };
    vector<string> result;
    string s;
    void backtracking(string digits,int index)
    {
        if(index==digits.size())
        {
            result.push_back(s);
            return;
        }
        int digit=digits[index]-'0';
        string letters=lettermap[digit]; 
        for(int i=0;i<letters.size();i++)
        {
            s.push_back(letters[i]);
            backtracking(digits,index+1);
            s.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
          return result;
        backtracking(digits,0);
        return result;
    }
};

注意:输入1 * #按键等等异常情况

代码中最好考虑这些异常情况,但题目的测试数据中应该没有异常情况的数据,所以我就没有加了。

但是要知道会有这些异常,如果是现场面试中,一定要考虑到!

并且当输入字符串长度为0时候,需要单独处理返回result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值