当前位置: 首页 > news >正文

电话号码的字母组合

题目: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。

相关文章:

电话号码的字母组合

题目&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; 给定一个电话号码字符串 digits&#xff0c;须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr&#xff0c;然后再用 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常见问题汇总

问题&#xff1a;Your branch is ahead of ‘origin/master’ by 1 commit 原因&#xff1a;你的本地分支高于远程仓库一次提交, 同步更新下&#xff0c;执行命令&#xff1a; git push origin master问题&#xff1a;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并发编程基础知识概述

前言 在现代计算机系统和服务器中&#xff0c;多线程并行执行已经成为常态&#xff0c;而且并发编程能够充分利用系统资源&#xff0c;提高程序处理效率和质量。因此&#xff0c;Java并发编程是Java程序员必须掌握的重要技能之一。 线程和进程 在操作系统中&#xff0c;进程是…...

Redis超详细入门手册教程!还不快来看看?

地址&#xff1a; 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&#xff1a;NoSQL简介 1.1&#xff1a;数据库应用的演变历程 单…...

代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录 121. 买卖股票的最佳时机122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 为什么定义dp数组为二维数组&#xff1f; dp数组定义&#xff0c;dp(i)[0] 表示第i天持有股票所得最多现金&#xff0c;dp(i)[1]表示第i天不持有股票的状态&#xff08;未必当前卖出&#x…...

零基础如何学习挖漏洞?看这篇就够了【网络安全】

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…...

Twitter 推荐算法底有多牛? 已斩获11.7K star

点击上方“Github中文社区”&#xff0c;关注 看Github&#xff0c;每天提升第070期分享 &#xff0c;作者&#xff1a;Huber | Github中文社区 大家好&#xff0c;我是Huber。 在美国当地时间 3 月 31 日&#xff0c;马斯克履行当初的诺言&#xff0c;他宣布了 Twitter 算法的…...

看过这篇文章,读懂数据分析

一、为什么需要数据分析 数据分析的重要性不言而喻&#xff0c;没有数据&#xff0c;就是感性。数据不会被观点打败&#xff0c;数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效&#xff0c;以数据驱动决策 站在公司或者决策者角度&#xff0c;数据最…...

[计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)

一、Light Field / Lumigraph—光场 1.我们看到的是什么 我们的眼睛能够把3D世界转换为2D的成像信号被我们感知&#xff0c;如上面第一幅图&#xff0c;这就是我们看到整个世界的过程&#xff0c;那么如果我们把之前记录的光的信息都完美的放在一个幕布上&#xff0c;那么我们…...

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产&#xff0c;高精地图成为关键的门槛之一。今年&#xff0c;多家车企和智驾公司都喊出「不依赖高精地图&#xff0c;快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等&#xff0c;可能是最快在国内量产 无高精图智…...

【Java笔试强训 17】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;杨辉三角…...

【IPv6】基本概念及字段

IPV4知识点&#xff1a; 字段值 IPv4字段共 字段值解释Version版本版本字段&#xff0c;可以区分V4和V6版本&#xff0c;V4是0100&#xff0c;V6是0110&#xff0c;需要注意的是V4和V6头部除了版本字段位置相同外&#xff0c;其他都是不一样的&#xff0c;因此两个协议不能直…...

数据库中的 Schema 变更实现

线上沙龙-技术流第 30 期营业啦 05月09日&#xff08;周二&#xff09;19:30 KaiwuDB - B站直播间 传统数据库操作 Schema 变更时&#xff0c;第一步便是锁表&#xff0c;需持续到 Schema 变更操作完成。这样的做法虽然实现简单&#xff0c;无需考虑事务并发带来的影响&#…...

【C++ 学习 ②】- 类和对象(上)

目录 一、 面向对象的基本理念 1.1 - 什么是对象&#xff1f; 1.2 - 类和对象 1.3 - 面向对象的五条原则 1.4 - 面向过程 vs 面向对象 二、C 中的结构体 三、类的定义 3.1 - 类的两种定义方式 3.2 - 成员变量的命名规范 四、类的访问限定符和封装 4.1 - 访问限定符 …...

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求&#xff1a;机械类与强电类专业学生追求的是 “机电合一” &#xff0c;既懂机械又懂电气&#xff0c;整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” &#xff0c;既懂硬件又懂软件&#xff0c;整个电子产品便能打通。我作…...

猫狗训练集训练报错: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 报错详细内容&#xff1a; ValueError: Failed to find data adapter that can handle input: (<class ‘tuple’> containing values of types {“<class ‘k…...

中国网络安全人才需求

如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手&#xff0c;那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜&#xff0c;知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站&#xf…...

设计模式之组合模式

目录 1、组合模式的定义 2、组合模式例子 3、组合模式实现 3.1 组合模式的结构 3.2 组合模式的分类 3.3 组合模式代码实现&#xff08;透明组合模式&#xff09; 4、组合模式的优点 5、组合模式使用场景 1、组合模式的定义 组合模式又名部分整体模式&#xff0c;是用于把…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...