LeetCode热题100 电话号码的字母组合

题目描述

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

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

示例 1:


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

示例 2:

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

提示:

1 <= digits.length <= 4

digits[i] 是范围 ['2', '9'] 的一个数字。

思路

1 使用哈希表存储每个数字代表的字符串。

2 digits的每个数字作为一层dfs,每次挑出字符串中的一个字符出来组成答案。

3 详细见代码。

代码

cpp 复制代码
class Solution {
public:
    // 利用哈希表存储每个数字的字符串
    unordered_map<char, string>mp{
        {'2', "abc"},
        {'3', "def"},
        {'4', "ghi"},
        {'5', "jkl"},
        {'6', "mno"},
        {'7', "pqrs"},
        {'8', "tuv"},
        {'9', "wxyz"},
        };

    vector<string> letterCombinations(string digits) {
        vector<string>ans;
        string res;

        int po = 0; // 遍历第po个位置的字符串
        string s = mp[digits[po]];
        int m = s.size();
        for(int i = 0; i < m; ++i)
        {
            res.push_back(s[i]);
            dfs(digits, res, ans);
            res.pop_back();
        }

        return ans;
    }

    void dfs(string &digits, string &res, vector<string> &ans)
    {
        if(res.size() == digits.size())
        {
            ans.push_back(res);
            return;
        }

        int po = res.size(); // 遍历第po个位置的字符串
        string s = mp[digits[po]];
        int m = s.size();
        for(int i = 0; i < m; ++i)
        {
            res.push_back(s[i]);
            dfs(digits, res, ans);
            res.pop_back();
        }
    }
    
};
相关推荐
nervermore9902 小时前
1.10 面试经典150题-多数元素
算法
c++逐梦人2 小时前
二分查找模版及二分答案例题
算法·蓝桥杯
Yusei_05232 小时前
C++17入门
c++
biubiuibiu2 小时前
选择适合的硬盘:固态与机械硬盘的对比与推荐
c++·算法
big_rabbit05022 小时前
[算法][力扣226]翻转一颗二叉树
数据结构·算法·leetcode
TracyCoder1232 小时前
LeetCode Hot100(65/100)——64. 最小路径和
算法·leetcode·职场和发展
z2014z2 小时前
Deflate 算法详解
网络·算法
条tiao条2 小时前
从 “Top-K 问题” 入门二叉堆:C 语言从零实现与经典应用
c语言·算法·深度优先
LXS_3572 小时前
案例 —— 机房预约系统
开发语言·c++·学习方法