17.电话号码的字母组合

  • 17.电话号码的字母组合
  • 思路:
    相比前面的回溯题,这道题差异在于在有多个集合(有一串数字,每次从当前数字对应的字符串中选一个字母出来组成字符串添加到结果集中);
    需用unordered_map来储存<数字, 字符串>的映射
    常规的结果集合 vector res 和 遍历的当前路径 string path
class Solution {
private:
    unordered_map<char, string> um = {{'2', "abc"}, {'3', "def"}, {'4', "ghi"},
                                         {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, 
                                         {'8', "tuv"}, {'9', "wxyz"}};
    vector<string> res;
    string path;
    void backtracking(const string& digits, int curNum) {//参数curNum来指出当前遍历到哪个集合,而不用startIndex,因为对于多集合来说每个集合都从0开始遍历,而对于单集合来说需要startIndex来指出从哪个位置开始
        if (curNum == digits.size()) {//终止条件,到了树了叶子节点
            res.push_back(path);
            return;
        }
        
        string temp = um[digits[curNum]];//确定当前集合
        for(int i = 0; i < temp.size(); ++i) {//遍历当前集合
            //if ()。。。这里其实可以加个判断,若是2~9以外的字符,则continue
            path.push_back(temp[i]);//先走
            backtracking(digits, curNum + 1);//递归
            path.pop_back();//回溯
        }
    }
public:
    vector<string> letterCombinations(string digits) {
        if (digits.size() == 0) return res;
        backtracking(digits, 0);

        return res;
    }
};

总结:

  1. 回溯有单集合和多集合之分;对应的回溯函数的参数也不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值