leetCode 17.电话号码的字母组合 + 回溯算法 + 图解 + 笔记

news2024/12/24 2:49:14

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


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

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

示例 1:

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

示例 2:

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

示例 3:

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

本题需要解决三个问题,思考和分析:

  • (1)数字和字母集合如何做映射
  • (2)两个字母就需要两个for循环,那很多个字母岂不是要很多层for循环嵌套,怎么解决?、
  • (3)输入1 * #按键等等异常情况

解决思路:1.创建字符集(使数字和字母集做映射) 

const string letterMap[10] = {
    "",     // 0
    "",     // 1
    "abc",  // 2
    "def",  // 3
    "ghi",  // 4
    "jkl",  // 5
    "mno",  // 6
    "pqrs", // 7
    "tuv",  // 8
    "wxyz", // 9
};

2.回溯算法来解决 for 循环的问题,举个栗子:输入"23",长度为 2

  • 回溯可以通过递归的方式来帮我们去实现嵌套几个for循环

  • 输入"23" 的长度为 2,正是树的深度
  • 叶子节点要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

>>回溯三部曲:

1).确定回溯函数参数

  • 字符串 strPath 来收集叶子节点的结果 
  • result 保存 strPath,作为结果集
  • index 是记录遍历第几个数字了,同时 index 也表示树的深度
vector<string> result;
string strPath;
void backtracking(const string& digits, int index)

2).确定终止条件

  • 如果 index 等于 输入的数字个数(digits.size)了,就终止,这是因为 index 就是用来遍历digits
  • 举个栗子:"23",有两个数字,那么根节点往下递归两层就可以了
  • 收集结果,结束本层递归
if(index == digits.size()) {
    result.push_back(strPath);
    return;
}

3).确定单层遍历逻辑

  • 先取出 index digits 中的数字,再取找出对应的字符集
  • 接着 for 循环处理这个字符集
int num = digits[index]-'0';// 将index指向的数字转为int
string charSet = letterMap[num];// 取数字对应的字符集
for(int i=0;i<charSet.size();i++) {
    strPath.push_back(charSet[i]);// 处理
    backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了
    strPath.pop_back();// 回溯
}

C++ 代码: 

class Solution {
public:
    vector<string> result;
    string strPath;
    const string letterMap[10] = {
        "",     // 0
        "",     // 1
        "abc",  // 2
        "def",  // 3
        "ghi",  // 4
        "jkl",  // 5
        "mno",  // 6
        "pqrs", // 7
        "tuv",  // 8
        "wxyz", // 9
    };
    void backtracking(const string& digits,int index) {
        if(index == digits.size()) {
            result.push_back(strPath);
            return;
        }
        int num = digits[index]-'0';// 将index指向的数字转为int
        string charSet = letterMap[num];// 取数字对应的字符集
        for(int i=0;i<charSet.size();i++) {
            strPath.push_back(charSet[i]);// 处理
            backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了
            strPath.pop_back();// 回溯
        }
    }
    vector<string> letterCombinations(string digits) {
        if (digits.size() == 0) return result;
        backtracking(digits,0); 
        return result;
    }
};

参考和推荐文章,视频: 

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html#%E6%80%9D%E8%B7%AF还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1yV4y1V7Ug/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车电子 -- 车载ADAS之DOW(开门预警 )

相关法规文件: DOW&#xff1a; GB/T XXXXX—XXXX 乘用车车门开启预警系统性能要求及试验方法 一、开门预警 DOW&#xff08;Door open Warning&#xff09; 参看&#xff1a;功能定义-开门碰撞预警 在停车状态即将开启车门时&#xff0c;监测车辆侧方及侧后方的其它道路使…

pdf文件能扫码查看吗?一键做文本二维码

pdf格式是常用的一种文件格式&#xff0c;很多资料、展示性的内容都会选择这种格式&#xff0c;现在很多人都需要将文件生成二维码图片后分享给他人&#xff0c;那么文件存入二维码展示的方法有哪些呢&#xff1f;下面给大家分享一招使用二维码生成器来生成二维码图片的操作方法…

UE5学习(游戏存档,两种适应性的射线检测,时间膨胀)

游戏存档 0.建立游戏存档类 1.建立存档 命名要用规律&#xff0c;读档时根据命名调用 2.读取存档 这里是用存档时间&#xff08;秒&#xff09;验证是否有存档成功。 两种鼠标位置射线检测方法 两种适用性未使用大量项目验证&#xff0c;为个人观点 1.适用于游戏中 2.适用于…

关于Linux服务器高并发场景下系统参数优化的诸多奇技淫巧

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容开篇内存优化——马达与燃油磁盘优化——加油与换胎网络参数优化——挂挡与提速进程优化——适度开疆拓土 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Ja…

Python+Appium自动化测试大法,让你的测试效率飞升,绝不等待!封装元素定位方法超详解!

在appium自动化测试脚本运行的过程中&#xff0c;因为网络不稳定、测试机或模拟器卡顿等原因&#xff0c;有时候会出现页面元素加载超时元素定位失败的情况&#xff0c;但实际这又不是bug&#xff0c;只是元素加载较慢&#xff0c;这个时候我们就会使用元素等待的方法来避免这种…

视频文案怎么写,媒介盒子支招

近几年短视频成为风口&#xff0c;各行各业都想分一杯羹&#xff0c;但是一头热的你&#xff0c;是否知道短视频的相关文案怎么写呢?正所谓兵马未动&#xff0c;文案先行&#xff0c;一个合适的文案是上热门的秘密武器&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;视频…

力扣2.两数相加

题目描述 把题读懂后&#xff0c;这道题存在两个需要解决的问题&#xff1a;1.进位问题&#xff1b;2.两个链表长度不一 代码 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//创建新链表的伪指针&#xff0c;指向链表的头结点ListNode prev n…

Spring源码解读之创建bean

本文章我们会解读一下Spring如何根据beanDefinition创建bean的&#xff1b; 代码入口&#xff1a; AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);applicationContext.refresh(); 当spring执行refresh(…

人工智能-产生式系统实验(动物识别)

1.实验目的 1.熟悉知识的表示方法 2.掌握产生式系统的运行机制 3.产生式系统推理的基本方法。 2.实验内容 运用所学知识&#xff0c;设计并编程实现一个小型动物识别系统&#xff0c;能识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。 规则库&…

什么是虚拟化?如何监控虚拟化设备

虚拟化是创建物理 IT 资源&#xff08;如服务器或桌面&#xff09;的虚拟版本的行为&#xff0c;虚拟机&#xff08;VM&#xff09;是在物理主机设备上创建的&#xff0c;VM 的行为与物理设备完全相同&#xff0c;并且可以从主机运行不同的操作系统。 例如&#xff0c;您可以在…

centos服务器扩容

centos服务器扩容 我的情况是&#xff0c;原服务器是一个80g磁盘&#xff0c;管理员又追加了120G到这块磁盘上&#xff0c;需要把这120G重新追加使用。 请确认你遇到的情况是否和我初始截图一致&#xff0c;再往下看&#xff0c;免得浪费时间与精力 服务器中有120G尚未使用&…

智能测径仪从这五大方面提升了性能

在测径仪的研发升级中&#xff0c;蓝鹏测控从未停下脚步&#xff0c;研究新的技术&#xff0c;让测径仪更好的为产线服务的功能。目前提供两种类型的在线测径仪&#xff0c;普通测径仪与智能测径仪&#xff0c;智能型主要在这五大方面进行了性能提升。 1、自动化程度 智能测径…

Update this scope and remove the “systemPath“

问题 解析&#xff1a; 在特定的指定路径上查找系统相关性。这大大降低了可移植性&#xff0c;因为如果您将工件部署在一个与您的环境不同的环境中&#xff0c;代码将无法工作。 解决&#xff1a; 1 使用官方maven仓库的第三方jar包 2 如果官方仓库不存在jar包&#xff0c;…

抖去推--短视频账号矩阵系统saas工具源码技术开发(源头)

一、短视频矩阵系统搭建常见问题&#xff1f; 1、抖去推的短视频AI矩阵营销软件需要一定的技术水平吗&#xff1f; 答&#xff1a;不需要。产品简单易用&#xff0c;不需要具备专业的技术水平&#xff0c;即使是初学者&#xff0c;也能够轻松上手操作。 3、抖去推的短视频AI矩…

E云管家微信群聊机器人开发

请求URL&#xff1a; http://域名地址/modifyGroupRemark 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRo…

my.ini添加了一句后又删除了,重启却失败的解决办法

背景&#xff1a;添加了一句&#xff0c;然后保存了&#xff0c;之后打开删掉了&#xff0c;结果就无法启动了&#xff0c;最后另存为ANSI格式&#xff0c;再把这个格式文件覆盖my.ini即可解决

有哪些程序员兼职接单的网站可以推荐?

话说程序员这个职业有个好处就是可以给自己打工&#xff0c;只要掌握了一技之长&#xff0c;就可以到外面接私活&#xff0c;一方面增加了自己的收入&#xff0c;另一方面还锻炼了自己的技术。 相信很多新手程序员&#xff0c;都希望能迅速提高自己的能力同时&#xff0c;又可…

flutter 文本不随系统设置而改变大小[最全的整理]

文本不随系统设置而改变大小[三] 前言方案十三&#xff1a;使用Flexible方案十四&#xff1a;使用MediaQueryData的textScaleFactor属性方案十五&#xff1a;使用FractionallySizedBox方案十六&#xff1a;使用自定义文本样式方案十七&#xff1a;使用自定义绘制&#xff08;Cu…

接口测试及常用接口测试工具(含文档)

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

MFC哈希实现 目标:知道初始密码的人,才能改密码及登录。只知道登录密码只能登录。避免密码直接写在代码里或本地,通过软件评估报告。----安全行业基础5

一种简单的登录设计&#xff0c;密码保存在本地。&#xff08;直接MD5不安全&#xff0c;别人可以更换本地的密码,得再加一层算法就相对安全一点&#xff09; 当然也可以用加密机或专门存密码的系统来实现&#xff0c;就过于复杂。目标&#xff1a;1、为了避免密码直接写在代码…