力扣题库电话号码的字母组合

本文介绍了一种使用回溯法解决电话号码转字母问题的方法。通过构建数字与字母的映射,采用递归的方式生成所有可能的字母组合,显著提高了算法效率。

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

寒假算法学习与练习

每日一题

电话转字母

题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

对于这道题想到的第一步是使用键值对,将数字对应到一个一个字符,想的是将字符都放在列表中,然后遍历digit,把每一个数字对应的列表列出来,然后来进行排列组合,这样的方法会使时间复杂度大大增大。作为菜鸡的我,去看了看大佬的解题方法,实现使用键值对,这个想法是对的,就是后面的处理,想的太复杂了,该题使用回溯法,大大降低了时间复杂度。

学习一下回溯法的基本思想

回溯法基本思想

就是列出所有情况,然后用深度优先搜索解空间树(就是列出所有结果),回溯就是回到父节点,去往另外一个子节点。这里就不过多赘述了。

该题回溯思想

解空间树:

代码:

void backtrack(vector<string> &result,const unordered_map<char,string>&phonemap,const string &digits,int index,string&combination)
{
    if(index==digits.length())
    {
        result.push_back(combination);
    }
    else{
        char digit=digits[index];
        const string &letters=phonemap.at(digit);
        for(const char&letter:letters)
        {
            combination.push_back(letter);//第一个字母
            backtrack(result,phonemap,digits,index+1,combination);//往下
            combination.pop_back();//下一个字母
        }
    }
}
vector<string> letterCombinations(string digits) {
    vector<string> result;
    if(digits.empty())
    {
        return result;
    }
    unordered_map<char,string>symbolValues={
        {'2',"abc"},
        {'3',"def"},
        {'4',"ghi"},
        {'5',"jk"},
        {'6',"mno"},
        {'7',"pqrs"},
        {'8',"tuv"},
        {'9',"wxyz"},
    }; 
    string combination;
    backtrack(result,symbolValues,digits,0,combination);
    return result;
}

代码解释

主体函数就是backtrack函数,传入的值分别是最后结果列表、键值对、数字列表、第几层(我理解是解空间树的第几层,也就是第几个数字),combination就是数字对应的每一个字母(2:abc)

用一个具体例子来解释代码运行过程,以23为例子

写的可能不是很清楚,我是这样一步一步走代码,理解代码的意思,实在是太菜了,只能先看懂别人的代码和思想,再继续前进。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lumos~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值