力扣日记1.23-【回溯算法篇】17. 电话号码的字母组合

力扣日记:【回溯算法篇】17. 电话号码的字母组合

日期:2023.1.23
参考:代码随想录、力扣

17. 电话号码的字母组合

题目描述

难度:中等

给定一个仅包含数字 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.length <= 4
  • digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

题解

class Solution {
public:
#define SOLUTION 1
#if SOLUTION == 1
    // 映射
    vector<string> n2c_map = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    vector<string> results;
    string path;
    vector<string> letterCombinations(string digits) {
        if (digits == "") return results;
        backtracking(digits, 0);
        return results;
    }
    void backtracking(string digits, int index) {
        // 终止条件
        if (path.size() == digits.size()) { // index == size
            results.push_back(path);
            return;
        }
        size_t num = (digits[index]-'0') - 2;  // 将字符转换为数字,注意作为索引从0开始,0->2, 9->7
        // for 循环遍历集合(index记录当前遍历到digits第几个数字,集合长度即为该数字对应的字符个数)
        // index 在进入下一层递归时会+1,从而对下一个数字的字符集合进行遍历
        for (int i = 0; i < n2c_map[num].size(); i++) {
            // 处理节点
            path.push_back(n2c_map[num][i]);
            // 递归
            backtracking(digits, index + 1);
            // 回溯
            path.pop_back();
        }
    }
#endif
};

复杂度

  • 时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数
  • 空间复杂度: O(3^m * 4^n)

如对于输入"2379",2和3有三个字母,7和9有四个字母,则最多可遍历 3*3*4*4次(每个数字都能各自取3或4次并组合)

思路总结

  • 将问题转换为树形结构,并模拟遍历、递归回溯过程很有帮助

  • 在这里插入图片描述

  • 本题中,for循环每次要遍历的集合为某个数字对应的所有字符(如2对应"abc"),不同于之前的题目,递归不需要在当前集合上进行(即不需要通过递归在“abc"中连续取值,即求的是不同集合之间的组合),因此不需要startindex来记录起始位置

  • 至于递归,从当前层进入下一层递归,整个集合需要改变,即从digits的当前数字递归到其下一个数字对应的集合,因此通过一个n2c_map来表示数字到字母的映射,就可以通过index表示当前遍历到digits的第几个数字,并能获取该数字对应的字符集合;同时,每次进入递归时,在参数上传入index + 1,可自动对index进行回溯

  • 其他的则按照模板写就好了。

  • 注意:如果是现场面试,一定要考虑到异常情况(如输入”1 * #“等情况)的处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flink-java使用介绍,flink,java,DataStream API,DataSet API,ETL,设置 jobname

1、环境准备 文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/ 仓库&#xff1a;https://github.com/apache/flink 下载&#xff1a;https://flink.apache.org/zh/downloads/ 下载指定版本&#xff1a;https://archive.apache.org/dist/flink…

洛谷C++简单练习day4

day4---进制转化---1.22 习题概述 题目描述 今天小明学会了进制转换&#xff0c;比如&#xff08;10101&#xff09;2 &#xff0c;那么它的十进制表示的式子就是 : 1*2^40*2^31*2^20*2^11*2^0&#xff0c; 那么请你编程实现&#xff0c;将一个M进制的数N转换成十进制表示…

VSCode Debug 参数设置说明

如果想在vscode中debug一个项目&#xff0c;比如python3 run.py --args 这个时候你需要着重关注几个参数&#xff0c;参数用两个双引号分开&#xff0c;不能有空格。 cwd :运行代码的基础目录env: 设置环境变量 PYTHONPATH&#xff1a; 设置项目用到的模块搜索路径&#xff…

开源模型应用落地-KnowLM模型小试-入门篇(一)

一、前言 你是否了解知识图谱&#xff1f;如果了解&#xff0c;你们的业务场景是否应用了知识图谱&#xff1f;实际上&#xff0c;知识图谱在各行各业都被广泛使用。例如&#xff0c;在搜索引擎优化方面&#xff0c;通过利用知识图谱&#xff0c;搜索引擎可以更好地理解网页内容…

【英文干货】【Word_Search】找单词游戏(第3天)

本期主题&#xff1a;Doors&#xff08;各式各样的门&#xff09; 本期单词&#xff1a; Automatic (Door) 自动门 Back (Door) 后门 Barn (Door) 谷仓的门 Battened (Door) 用木条加固的门 Fire (Door) 防火门 Front (Door) 前门 Garage (Door) 车库的门 Glazed (Door…

大数据学习之Flink算子、了解(Transformation)转换算子(基础篇三)

Transformation转换算子&#xff08;基础篇三&#xff09; 目录 Transformation转换算子&#xff08;基础篇三&#xff09; 三、转换算子&#xff08;Transformation&#xff09; 1.基本转换算子 1.1 映射&#xff08;Map&#xff09; 1.2 过滤&#xff08;filter&#xf…

【优先级队列 之 堆的实现】

文章目录 前言优先级队列 PriorityQueue优先队列的模拟实现 堆堆的储存方式堆的创建建堆的时间复杂度堆的插入与删除 总结 前言 优先级队列 PriorityQueue 概念&#xff1a;对列是先进先出的的数据结构&#xff0c;但有些情况&#xff0c;数据可能带有优先级&#xff0c;一般出…

C++:使用tinyXML生成矢量图svg

先说一下tinyXML库的配置&#xff1a; 很简单&#xff0c;去下面官网下载 TinyXML download | SourceForge.net 解压后是这样 直接将红框中的几个文件放到项目中即可使用 关于svg文件&#xff0c;SVG是基于XML的可扩展矢量图形&#xff0c;svg是xml文件&#xff0c;但是xml…

TCP三握四挥(面试需要)

TCP建立连接需要三次握手过程&#xff0c;关闭连接需要四次挥手过程 三次握手 从图中可以看出&#xff0c;客户端在发起connect时&#xff0c;会发起第一次和第三次握手。服务端在接收客户端连接时&#xff0c;会发起第二次握手。 这三次握手&#xff0c;都会通过SYNACK的方式…

阿里云4核8G云服务器价格、带宽及系统盘费用

阿里云服务器4核8g配置云服务器u1价格是955.58元一年&#xff0c;4核8G配置还可以选择ECS计算型c7实例、计算型c8i实例、计算平衡增强型c6e、ECS经济型e实例、AMD计算型c8a等机型等ECS实例规格&#xff0c;规格不同性能不同&#xff0c;价格也不同&#xff0c;阿里云服务器网al…

EasyExcel入门使用

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、写等功能。 EasyExcel 的主要特点如下&#xff1a; 1、高性能&#xff1a;EasyExcel 采用了异步导入导出的方式&…

数据结构:搜索二叉树 | 红黑树 | 验证是否为红黑树

文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树&#xff0c;本文在前文的基础上&#xff0c;图解红黑树插入&#xff1a;前文 链接&#xff0c;完整对部分关键代码展示&a…

macOS跨进程通信: Unix Domain Socket 创建实例

macOS跨进程通信: Unix Domain Socket 创建实例 一&#xff1a; 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket&#xff0c; 和类Unix 系统&#xff08;包括Mac&#xff09;独有的 Unix Domain Socket&#xff08;UDX&#xff09;。 Tcp So…

避雷!仅1天撤回55篇中国学者的研究论文!这本毕业神刊需要注意!

【SciencePub学术】 这本国际期刊&#xff0c;仅仅去年12月一个月的时间&#xff0c;就撤回了近60篇国人文章&#xff01;这本期刊就是来自Hindawi出版社的APPLIED BIONICS AND BIOMECHANICS。 01 期刊信息简介 APPLIED BIONICS AND BIOMECHANICS IF(2022)&#xff1a;2.2&…

三维城市模型提升日本的智慧城市管理

MicroStation 将工作效率提高 50%&#xff0c;实现了前所未有的逼真模拟 构建三维城市模型生态系统 PLATEAU 项目由日本国土交通省牵头&#xff0c;是一项三维城市模型和数字孪生计划&#xff0c;旨在到 2027 年为日本 500 个城市构建开放的城市模型数字生态系统。作为日本最…

java获取linux和window序列号

前言 获取系统序列号在Java中并不是一个直接支持的功能&#xff0c;因为Java语言本身并不提供直接访问硬件级别的信息&#xff0c;如CPU序列号。但是&#xff0c;我们可以使用一些平台特定的工具或命令来实现这一功能。下面我将展示如何使用Java获取Windows和Linux系统上的CPU…

通过代理服务器的方式解决跨域问题

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 这里以本地访问https://heimahr.itheima.net/api/sys/permission接口为列子 Node.js 代理服务器 (server.js) 本次考虑使用JSONP或CORS代理来…

PHP“引用”漏洞

今日例题&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); include("flag.php"); class just4fun { var $enter; var $secret; } if (isset($_GET[pass])) { $pass $_GET[pass]; $passstr_replace(*,\*,$pass); } $o unser…

【操作系统】实验三 编译 Linux 内核

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

[Linux]HTTP状态响应码和示例

1xx&#xff1a;信息响应类&#xff0c;表示接收到请求并且继续处理 2xx&#xff1a;处理成功响应类&#xff0c;表示动作被成功接收、理解和接受 3xx&#xff1a;重定向响应类&#xff0c;为了完成指定的动作&#xff0c;必须接受进一步处理 4xx&#xff1a;客户端错误&#x…