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

digitsi 是范围 '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();
        }
    }
    
};
相关推荐
To_OC12 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
炸膛坦客13 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎14 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC14 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
Henry Zhu12314 小时前
C++中的特殊成员函数与智能指针
c++
delishcomcn15 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹15 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术15 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
_wyt00117 小时前
多重背包问题详解
c++·背包dp