电话号码的字母组合
题目:17. 电话号码的字母组合 - 力扣(Leetcode)
思路:
给定一个电话号码字符串 digits,须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr,然后再用 Combine 函数递归地去尝试构造出每一个可能的字母组合。当已经处理完已知的所有数字时(即 di == digits.size()),就可以将当前已经组合好的字符序列 combineStr 加入到结果列表 retV 中。
具体递归过程的实现如下:首先获取当前要处理的数字编号 num,从映射表中取出该数字对应的所有字符 str,并遍历该字符集中的每一个字符 ch:将 ch 这个字符追加到当前的字符序列 combineStr 中,然后继续往下一层递归;在这个新的递归中,di 的值加一,以便能够继续处理下一个数字。直到我们处理完所有的数字并递归返回到最初的调用点结束整个递归过程为止。
注意上述递归过程中,临时字符串 combineStr 是通过每次添加新字符而累积的,因此需要在递归返回时进行回退,以保证下一轮试探可以得到正确的结果。
代码实现:
class Solution
{//定义数字字符到字母表的映射表string numToStr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//或者:char* numToStr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:void Combine(string digits, int di, vector<string>& retV, string combineStr) {//递归结束标志:已经处理完所有的数字,将当前字母串加入结果列表if(di == digits.size()) {retV.push_back(combineStr);return;}//获取当前要处理的数字编号及其对应的字母串int num = digits[di] - '0';string str = numToStr[num];for(auto ch: str) {//往下一层搜索找到新的字母字符并加入当前字母串Combine(digits, di+1, retV, combineStr+ch);} }vector<string> letterCombinations(string digits) {vector<string> v;//单独处理空字符串的情况if(digits.empty()) {return v;}//递归生成所有可能的字母组合string str;Combine(digits, 0, v, str);return v;}
}; 解释:
这段代码主要实现了一个递归回溯法,用于求解电话号码的字母组合问题。下面是它的详细解释:
第1步:定义类Solution和一个私有函数Combine以及一个公有函数letterCombinations
第2步:定义数字字符到字母表的映射表numToStr,其中第一个条目对应的是数字 0。这里使用字符串数组来存储映射字符。
第3步:定义回溯函数Combine,它有4个参数:当前正在处理的电话号码(digits)、当前处理到的数字位置(di)、结果列表容器(retV)和已经处理好的字母组合串(combineStr)。
第4步:在Combine中,当要处理的数字位置 di 达到了 digits 的长度时,即表明已经完成了一次字母组合的构造。此时将之前收集到的正确字母组合串追加到结果列表retV 中,并直接退出该递归过程。
第5步:当递归搜索还未结束时,从当前数字位置开始(di 所指的位置),获取该位置上的数字编号 num,并找到对应的字母串 str。然后遍历该字符集中的每一个字符 ch,在 combineStr 后添加该字符,也就是生成了一个新的临时字母组合串,形如 combineStr+ch。
第6步:新的临时字母组合串(即combineStr+ch)被传入到下一层搜索中,以便用于试探下一个数字所对应的所有可能字母。
第7步:最终、递归地从 combineStr 开始往后连接新的字符,直到整个字符串构造完成。Combine 函数的返回值表示所有可能的字母组合串,以向上递归给调用函数传递答案。
第8步:letterCombinations 外部函数中,为效率考虑先对空字符串进行特判;然后用 Combine 函数生成所有可能的字母组合排列,并返回结果容器 retV。
相关文章:
电话号码的字母组合
题目:17. 电话号码的字母组合 - 力扣(Leetcode) 思路: 给定一个电话号码字符串 digits,须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr,然后再用 Combine 函数递归…...
PAT A1032 Sharing
1032 Sharing 分数 25 作者 CHEN, Yue 单位 浙江大学 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, l…...
Git常见问题汇总
问题:Your branch is ahead of ‘origin/master’ by 1 commit 原因:你的本地分支高于远程仓库一次提交, 同步更新下,执行命令: git push origin master问题:warning: LF will be replaced by CRLF in main.lua The …...
设计模式之代理模式(静态代理动态代理)
目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 1、什么是代理模式 由于某些原因需要给某对象提供一个代理以控制对…...
Java并发编程基础知识概述
前言 在现代计算机系统和服务器中,多线程并行执行已经成为常态,而且并发编程能够充分利用系统资源,提高程序处理效率和质量。因此,Java并发编程是Java程序员必须掌握的重要技能之一。 线程和进程 在操作系统中,进程是…...
Redis超详细入门手册教程!还不快来看看?
地址: RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/ 1:NoSQL简介 1.1:数据库应用的演变历程 单…...
代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
文章目录 121. 买卖股票的最佳时机122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 为什么定义dp数组为二维数组? dp数组定义,dp(i)[0] 表示第i天持有股票所得最多现金,dp(i)[1]表示第i天不持有股票的状态(未必当前卖出&#x…...
零基础如何学习挖漏洞?看这篇就够了【网络安全】
前言 有不少阅读过我文章的伙伴都知道,我从事网络安全行业已经好几年,积累了丰富的经验和技能。在这段时间里,我参与了多个实际项目的规划和实施,成功防范了各种网络攻击和漏洞利用,提高了安全防护水平。 也有很多小…...
Twitter 推荐算法底有多牛? 已斩获11.7K star
点击上方“Github中文社区”,关注 看Github,每天提升第070期分享 ,作者:Huber | Github中文社区 大家好,我是Huber。 在美国当地时间 3 月 31 日,马斯克履行当初的诺言,他宣布了 Twitter 算法的…...
看过这篇文章,读懂数据分析
一、为什么需要数据分析 数据分析的重要性不言而喻,没有数据,就是感性。数据不会被观点打败,数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效,以数据驱动决策 站在公司或者决策者角度,数据最…...
[计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)
一、Light Field / Lumigraph—光场 1.我们看到的是什么 我们的眼睛能够把3D世界转换为2D的成像信号被我们感知,如上面第一幅图,这就是我们看到整个世界的过程,那么如果我们把之前记录的光的信息都完美的放在一个幕布上,那么我们…...
L4公司进军辅助驾驶,放话无图也能跑遍中国
作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产,高精地图成为关键的门槛之一。今年,多家车企和智驾公司都喊出「不依赖高精地图,快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等,可能是最快在国内量产 无高精图智…...
【Java笔试强训 17】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥杨辉三角…...
【IPv6】基本概念及字段
IPV4知识点: 字段值 IPv4字段共 字段值解释Version版本版本字段,可以区分V4和V6版本,V4是0100,V6是0110,需要注意的是V4和V6头部除了版本字段位置相同外,其他都是不一样的,因此两个协议不能直…...
数据库中的 Schema 变更实现
线上沙龙-技术流第 30 期营业啦 05月09日(周二)19:30 KaiwuDB - B站直播间 传统数据库操作 Schema 变更时,第一步便是锁表,需持续到 Schema 变更操作完成。这样的做法虽然实现简单,无需考虑事务并发带来的影响&#…...
【C++ 学习 ②】- 类和对象(上)
目录 一、 面向对象的基本理念 1.1 - 什么是对象? 1.2 - 类和对象 1.3 - 面向对象的五条原则 1.4 - 面向过程 vs 面向对象 二、C 中的结构体 三、类的定义 3.1 - 类的两种定义方式 3.2 - 成员变量的命名规范 四、类的访问限定符和封装 4.1 - 访问限定符 …...
最好的物联网教程:软硬结合——从零打造物联网
在大学里不同专业有着不同的追求:机械类与强电类专业学生追求的是 “机电合一” ,既懂机械又懂电气,整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” ,既懂硬件又懂软件,整个电子产品便能打通。我作…...
猫狗训练集训练报错:Failed to find data adapter that can handle input
这里写自定义目录标题 Jupyter Notebook6.5.4 tensorflow 2.12.0 pillow 9.5.0 numpy 1.23.5 keras 2.12.0 报错详细内容: ValueError: Failed to find data adapter that can handle input: (<class ‘tuple’> containing values of types {“<class ‘k…...
中国网络安全人才需求
如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手,那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜,知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站…...
设计模式之组合模式
目录 1、组合模式的定义 2、组合模式例子 3、组合模式实现 3.1 组合模式的结构 3.2 组合模式的分类 3.3 组合模式代码实现(透明组合模式) 4、组合模式的优点 5、组合模式使用场景 1、组合模式的定义 组合模式又名部分整体模式,是用于把…...
TranslucentTB:轻量任务栏视觉增强工具,让Windows桌面颜值提升300%
TranslucentTB:轻量任务栏视觉增强工具,让Windows桌面颜值提升300% 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB …...
3分钟快速找回QQ号:手机号逆向查询终极指南
3分钟快速找回QQ号:手机号逆向查询终极指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录重要应用?或者需要验证手机号与QQ的绑定关系?今天我要介绍的这款Pyth…...
如何用ExplorerPatcher解决Windows 11界面不适问题提升工作效率
如何用ExplorerPatcher解决Windows 11界面不适问题提升工作效率 【免费下载链接】ExplorerPatcher 提升Windows操作系统下的工作环境 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher Windows 11带来的界面变革让许多用户感到操作不便,任…...
智能排错助手:让快马AI分析你的openclaw安装错误并生成解决方案
最近在折腾openclaw这个工具时,遇到了不少安装报错的问题。作为一个经常在各类开发环境中摸爬滚打的程序员,我发现这类开源工具的安装过程往往隐藏着不少坑。不过这次尝试用AI辅助诊断后,整个排错效率提升了不少,这里记录下我的实…...
会议纪要助手:OpenClaw+GLM-4.7-Flash实时转录与摘要
会议纪要助手:OpenClawGLM-4.7-Flash实时转录与摘要 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。上周三的部门周会结束后,我花了40分钟反复听录音、手敲重点,结果还是漏掉了两个关键决议事项。这种低效重复劳动让我…...
计算机毕业设计springboot校园外卖系统 基于Spring Boot的高校餐饮配送服务平台 Spring Boot框架下的校园在线订餐与配送管理系统
计算机毕业设计springboot校园外卖系统n322b9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的日益成熟和普及,网络已经深度融入人们的日常生活&…...
16-bit像素艺术AI终端效果展示:实时HUD状态栏+物理位移反馈动效演示
16-bit像素艺术AI终端效果展示:实时HUD状态栏物理位移反馈动效演示 1. 像素幻梦创意工坊概览 Pixel Dream Workshop(像素幻梦创意工坊)是一款革命性的像素艺术生成工具,基于先进的FLUX.1-dev扩散模型构建。与传统AI绘图工具不同…...
5步构建静音高效的电脑散热系统:FanControl全面指南
5步构建静音高效的电脑散热系统:FanControl全面指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...
安卓逆向实战:用Frida绕过App反调试的5种常见检测(附完整脚本)
安卓逆向工程实战:Frida对抗反调试的深度解决方案 在移动安全研究领域,逆向工程师经常面临各种反调试技术的挑战。当传统的调试工具遭遇精心设计的防护机制时,往往束手无策。本文将深入探讨五种主流反调试检测手段的对抗策略,提供…...
3步突破设备壁垒:让VR内容在普通显示器上重生的开源方案
3步突破设备壁垒:让VR内容在普通显示器上重生的开源方案 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_…...
