Leecode刷题热题HOT100(17)——电话号码的字母组合

📋 前言

  • 🖱 博客主页:在下马农的碎碎念
  • 🤗 欢迎关注🔎点赞👍收藏⭐️留言📝
  • ✍ 本文由在下马农原创,首发于CSDN
  • 📆 首发时间:2021/12/25
  • 📅 最近更新时间:2021/12/25
  • 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
  • 📇 系列文章目录: 快点我呀,我是目录
  • 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!

请添加图片描述

我吃得下一个超市,一群牲口,吃得下一群梦想和野心。——《饥饿是很好的锻炼》

在这里插入图片描述
以下是正文

🍅 题目

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

🍅 解题思路

🍏方法一:回溯法

回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。

🍅 我的答案

class Solution {
public:
    void backtrack(unordered_map<char,string> &phone,vector<string> &result,int index,const string &digits,string &tempStr){
        if(index == digits.size()) {    // 表示只剩最后一位
            result.push_back(tempStr);
        } else {
            char ch = digits[index];    // 当前数字
            const string letters = phone.find(ch)->second;  // 当前数字的字母
            for(char c :letters){       // 当前数字的每一个字母,回溯
                tempStr.push_back(c);
                backtrack(phone,result,index+1,digits,tempStr); 
                tempStr.pop_back();
            }
        }
    }
    vector<string> letterCombinations(string digits) {
        vector<string> result;
        unordered_map<char,string> phone = {
            {'2',"abc"},
            {'3',"def"},
            {'4',"ghi"},
            {'5',"jkl"},
            {'6',"mno"},
            {'7',"pqrs"},
            {'8',"tuv"},
            {'9',"wxyz"}
        };
        int len = digits.size();
        if(len == 0) {
            return result;
        }
        string tempStr;         // 存储过程中的不完整字符串
        backtrack(phone,result,0,digits,tempStr); 
        return result;
    }
};

🍅 优质解答

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> combinations;
        if (digits.empty()) {
            return combinations;
        }
        unordered_map<char, string> phoneMap{
            {'2', "abc"},
            {'3', "def"},
            {'4', "ghi"},
            {'5', "jkl"},
            {'6', "mno"},
            {'7', "pqrs"},
            {'8', "tuv"},
            {'9', "wxyz"}
        };
        string combination;
        backtrack(combinations, phoneMap, digits, 0, combination);
        return combinations;
    }

    void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {
        if (index == digits.length()) {
            combinations.push_back(combination);
        } else {
            char digit = digits[index];
            const string& letters = phoneMap.at(digit);
            for (const char& letter: letters) {
                combination.push_back(letter);
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.pop_back();
            }
        }
    }
};

🍅 知识积累


在这里插入图片描述

随手点赞👍一次,运气增加一分哦🙏🙏🙏


注:本文中题目信息及优质解答来自力扣网

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在下马农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值