力扣 第17题 电话号码的字母组合 (递归求解)

力扣17 - 电话号码字母组合【回溯、哈希映射、队列】 对应力扣.17电话号码字母组合,详细动画和图示讲解,带你快乐刷 阅读详情

题目:

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number

示例 1:

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

示例 2:

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

示例 3:

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

代码:

class Solution {
public:
    int flag = 0;

    void insert(vector<string>& dest, const vector<string>& src, const string& digits, int index)
    {
        if (index == digits.size())
            return;
        else
        {
            string tmp = src[digits[index] - '0'];
            int count = 0;
            int pos = 0;
            if (index == 0)
            {
                flag = dest.size() / tmp.size();
            }
            else
            {
                flag = flag / tmp.size();
            }
            for (size_t i = 0; i < dest.size(); i++)
            {
                if (count < flag)
                {
                    dest[i].push_back(tmp[pos]);
                    count++;
                }
                else
                {
                    pos++;
                    if (pos == tmp.size())
                    {
                        pos = 0;
                    }
                    count = 0;
                    i--;
                }
            }
        }
        insert(dest, src, digits, ++index);
    }
    vector<string> letterCombinations(string digits) {
        static vector<string> mark;
        mark.push_back("");
        mark.push_back("");
        mark.push_back("abc");
        mark.push_back("def");
        mark.push_back("ghi");
        mark.push_back("jkl");
        mark.push_back("mno");
        mark.push_back("pqrs");
        mark.push_back("tuv");
        mark.push_back("wxyz");
        
        vector<string> ret;
        if (digits == "")
        {
            // ret.push_back("");
            return ret;
        }
        int count = 0;
        for (size_t i = 0; i < digits.size(); i++)
        {
            if (digits[i] == '7' || digits[i] == '9')
                count++;
        }
        ret.resize(pow(3, digits.size() - count) * pow(4, count));
        insert(ret, mark, digits, 0);
        return ret;
    }
};

做这种题最重要的就是找到规律,其中最重要的就是利用flag来记录每个数字所代表的字符串中每个字符分别插入到vector<string> 的哪一个位置,随着数字的变化flag发生变化,字母所插入的位置发生变化。

 

Java实现 LeetCode 17 电话号码字母组合 17. 电话号码字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/p... 阅读详情

相关推荐

可乐学习NVMe之一:为什么SSD需要NVMe

1. NVMe SSD 结构简图 整体来看,NVMe SSD可以分为三部分,host端的驱动NVMe Driver、PCIe+NVMe实现的控制器以及NAND Flash+DDR4/DDR5存储介质。 芯片回片后Host侧软件或者驱动开发主要在应用层,通过一些测试工具进行benchmark跑分测试,performance性能分析,latency分析、stress-testing等等: 那么,接下来阐述为什么SSD需要NVMe,并再后续的文章介绍NVMe协议分析,个人针对协议的理解,如果有不当之处,还请各

Lucky 3106

【LeetCode】-- 17.电话号码字母组合

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同),注意 1 不对应任何字母

局部变量和全局变量 951

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5249

Java-电话号码字母组合

Java-电话号码字母组合-回溯法

weixin_58643728的博客 1281

leetcode17. 电话号码字母组合

leetcode17. 电话号码字母组合

Brant_zero的博客 1391

算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合

目 给定一个仅包含数字 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.l

男儿不展风云志,空有天生八尺躯 4756

leetcode 17.电话号码字母组合

leetcode 17.电话号码字母组合 目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答...

EngineerHe的博客 1106

【Leetcode hot 100】17.电话号码字母组合

目要求根据数字字符串返回所有可能的字母组合(类似电话按键输入)。通过回溯法(DFS)或迭代法(BFS)均可解决。回溯法通过递归和回溯遍历所有路径,时间复杂度为O(3^m×4^n),空间复杂度O(m+n)。迭代法使用队列逐层构建组合,时间复杂度相同但空间复杂度较高。实际应用中,回溯法更简洁高效,适合本数字长度≤4的场景。两种方法均需先建立数字-字母映射表,处理边界条件(空输入返回空列表)。

专注Java和MySQL领域知识分享 568

17. 电话号码字母组合力扣LeetCode)

函数backstracking是核心,它会递归地探索所有可能的字母组合,每次递归调用都会向一个组合中添加一个字母,直到得到一个完整的字母组合然后将其添加到结果集中。函数中使用了path变量来存储当前的字母组合状态,并在每次递归返回之前进行回溯,以便尝试下一个可能的字母组合。变量a是一个映射数组,它将数字映射到对应的所有可能字母上。输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]给出数字到字母的映射如下(与电话按键相同)。输出:[“a”,“b”,“c”]

m0_73841621的博客 522

算法练习第二十五天| 216.组合总和III、17.电话号码字母组合

leetcode目链接。17.电话号码字母组合。216.组合总和III。

qq_51059003的博客 503

【每日算法】LeetCode 17. 电话号码字母组合

摘要: LeetCode 17要求根据电话数字组合返回所有可能的字母排列。该问本质是组合问,适合用回溯算法解决,其核心是通过递归探索所有路径(时间复杂度O(3^m×4^n),空间O(m+n))。提供了三种实现:经典回溯(递归清晰)、迭代法(队列避免栈溢出)和函数式编程(代码简洁)。回溯算法最优,因其必须遍历所有组合且空间效率高。类似场景包括前端动态表单、路由权限组合等,掌握此类算法能提升复杂系统设计能力。

LYFlied的博客 915

代码随想录算法训练营day25| 216.组合总和III、17.电话号码字母组合

回溯算法

weixin_45368277的博客 902

笔记:力扣17-电话号码字母组合

本文介绍了一种使用递归回溯算法解决电话号码字母组合的方案。通过定义数字到字母的映射表(vis)和对应字母数量表(visLen),采用深度优先搜索遍历所有可能的字母组合。算法核心包括递归终止条件判断和回溯循环处理,通过维护path数组记录当前组合,最终将所有有效组合存入结果数组。该方案时间复杂度为O(3^m×4^n),空间复杂度为O(len),其中m对应3字母数字个数,n对应4字母数字个数,是此类问的最优解法。

hanlin03的博客 184

代码随想录算法训练营第25天|216.组合总和III 17.电话号码字母组合

252525

dieforcpp的博客 187

LeetCode17.电话号码字母组合

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

2503_93062705的博客 214

Leetcode+JAVA+回溯1

给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],[[1]]这个问要求生成从 1 到 n 中选择 k 个数字的所有可能组合。组合问与排列问不同,组合不考虑顺序(如 [1,2] 和 [2,1] 是相同的),且每个数字只能使用一次。我们可以使用。

weixin_58628068的博客 1062

day25 回溯 | 216,17

​​​​​​​解决输入字符对应的序列的映射问。类似组合问,单个序列中回溯即可。17.电话号码字母组合。216.组合总和III。

Lzinner的博客 146

LeetCode 热17 电话号码字母组合

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

uifmlj的博客 1465

【LeetCode】17.电话号码字母组合

LeetCode17.电话号码字母组合 思路讲解和代码展示

Eristic0618的博客 1725

算法训练 leetcode 17 电话号码字母组合

回溯递归的 index 就是index+1,不用 让它变成 i+1,i+1 是 start_index,就是在循环它本身的时候,取除了它本身后面的值,这个是同一个集合从前往后取 不能重复的情况,而我们现在是两个独立的集合,互相组合,index 为1 的可以取到 下一个集合index 为1 的,就是上面图的例子。假设有两个数字,那就是有两份字符串,我们把一个字符串先作为 for 循环的变量,就是说这个决定了 树的宽度,然后,另外一个字符串看成是 递归里面的变量,这个是递归的深度。这里的index不需要去重。

Amy_au的博客 1158

LabVIEW与汇川H5U PLC通信:全面解析官方协议,实现安全稳定的报文读取与通讯配置

LabVIEW与汇川H5U PLC之间的通信协议及其具体实现方法。首先,解释了官方通信协议的内容,确保数据的安全稳定传输。接着,探讨了辅助测试和无程序网络通讯的实现,简化了调试过程并提高了测试效率。然后,列举了常用的通信功能,如命令帧读写、字符串读写、XYMBool批量读写和支持YM单点读写。此外,文中还提供了程序源码和命令帧文本编写的指导,强调了无需调用DLL或安装插件的优势。最后,对比了与其他通信方式(如OPC)的不同之处,突出了LabVIEW与汇川H5U PLC通信的优越性。适合人群:从事工业自动化领域的工程师和技术人员,尤其是对LabVIEW和汇川H5U PLC有初步了解的人群。使用场景及目标:适用于需要实现高效稳定的PLC与LabVIEW通信的项目,旨在帮助工程师掌握具体的通信技术和优化生产流程。其他说明:本文不仅提供理论讲解,还包括实际操作指导和源码分享,有助于读者更好地理解和应用相关技术。

上一篇: C语言实现一个简单的通讯录
下一篇: 剑指 Offer 65. 不用‘+’、‘ - ’、‘ * ’、‘ / ’ 运算符号做完成加法
CH_Victor
博客等级 码龄5年 2粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值