力扣第十七题——电话号码的字母组合

内容介绍

给定一个仅包含数字 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 List<String> letterCombinations(String digits) {List<String> combinations = new ArrayList<String>();if (digits.length() == 0) {return combinations;}Map<Character, String> phoneMap = new HashMap<Character, String>() {{put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");}};backtrack(combinations, phoneMap, digits, 0, new StringBuffer());return combinations;}public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {if (index == digits.length()) {combinations.add(combination.toString());} else {char digit = digits.charAt(index);String letters = phoneMap.get(digit);int lettersCount = letters.length();for (int i = 0; i < lettersCount; i++) {combination.append(letters.charAt(i));backtrack(combinations, phoneMap, digits, index + 1, combination);combination.deleteCharAt(index);}}}
}

思路详解

1. 初始化返回列表
List<String> combinations = new ArrayList<String>();

创建一个空列表combinations,用于存储所有可能的字母组合。

2. 检查输入字符串是否为空
if (digits.length() == 0) {return combinations;
}

如果输入的数字字符串为空,则直接返回空列表。

3. 创建电话键盘映射
Map<Character, String> phoneMap = new HashMap<Character, String>() {{put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");
}};

使用一个HashMap来存储电话键盘上的数字到对应字母的映射。

4. 调用回溯函数
backtrack(combinations, phoneMap, digits, 0, new StringBuffer());

调用backtrack函数来填充combinations列表,从索引0开始,并使用一个StringBuffer来构建当前的字母组合。

5. 定义回溯函数
public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {

backtrack是一个递归函数,用于生成所有可能的字母组合。

6. 回溯终止条件
if (index == digits.length()) {combinations.add(combination.toString());
}

index等于digits的长度时,表示一个完整的组合已经构建完成,将其添加到combinations列表中。

7. 构建组合
char digit = digits.charAt(index);
String letters = phoneMap.get(digit);
int lettersCount = letters.length();
for (int i = 0; i < lettersCount; i++) {combination.append(letters.charAt(i));backtrack(combinations, phoneMap, digits, index + 1, combination);combination.deleteCharAt(index);
}

对于当前数字digit,获取其对应的字母字符串letters,然后遍历这些字母:

  • 将当前字母添加到combination中。
  • 递归调用backtrack函数,将index加1,表示向组合中添加下一个字母。
  • 在递归返回后,移除combination中最后一个添加的字母,以便尝试下一个字母。

知识点精炼

总结 

该代码通过回溯算法生成所有可能的字母组合。回溯是一种试探性的算法,它在每一步都尝试所有可能的选择,并在达到某个条件时回退到上一步,尝试其他选择。在电话键盘字母组合的问题中,回溯算法通过递归地构建每个数字对应的字母组合,最终生成所有可能的组合。

  1. 递归与回溯

    • 使用递归函数backtrack实现回溯算法,这是一种通过不断尝试所有可能的选择来找到所有解的算法。
  2. 映射关系

    • 利用HashMap建立数字到字母的映射关系,方便根据输入的数字找到对应的字母组合。
  3. 字符串处理

    • 使用StringBuffer来动态构建字符串,它比普通字符串更高效,因为它允许修改。
  4. 递归终止条件

    • 当递归的深度等于输入数字字符串的长度时,表示已经构建了一个完整的组合,此时将组合添加到结果列表中。
  5. 循环与递归结合

    • 在递归函数中,通过一个循环遍历当前数字对应的每个字母,并在每次循环中递归调用自身。
  6. 状态重置

    • 在递归返回后,通过combination.deleteCharAt(index)撤销上一次的选择,以便尝试其他可能的字母。
  7. 参数传递

    • 递归函数中通过参数传递当前的状态,包括结果列表、映射表、输入字符串、当前索引和当前组合。
  8. 边界条件检查

    • 在主函数letterCombinations中,首先检查输入字符串是否为空,为空则直接返回空列表。
  9. 时间复杂度

    • 算法的时间复杂度是O(4^n),其中n是输入字符串的长度,因为每个数字最多对应4个字母。
  10. 空间复杂度

    • 空间复杂度主要取决于递归调用的深度和结果列表的大小,最坏情况下为O(4^n)。

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

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

相关文章

Armpro搭建教程全开源版的教程

Armpro搭建教程 全开源版的教程&#xff0c;其他未知 资源宝整理分享 www.httple.net 首先ssh执行指令安装运行环境 yum install java-1.8.0-openjdk* -y导入文件服务器 导入arm.zip到www目录下然后解压 导入jar包.zip到www目录然后解压 导入basic.zip到www目录然后解压在宝塔…

创造视觉奇迹:WebKit的CSS内容生成特性解析

创造视觉奇迹&#xff1a;WebKit的CSS内容生成特性解析 在现代Web开发中&#xff0c;CSS不仅是样式表&#xff0c;它还是一个强大的内容生成工具。WebKit&#xff0c;作为众多流行浏览器的内核&#xff0c;如Safari&#xff0c;支持丰富的CSS内容生成特性&#xff0c;使得开发…

【C++新特性——using】

1typedef&using 类型定义别名 #include<iostream> using namespace std;void f(int index) //事例函数指针 {cout << "void f(int)->" << index << endl;}int main() {//typedef: 旧名 新名typedef unsigned int x; //using: …

CTFshow--web--xss

目录 web316 web317~319 web320~326 web327 web328 web329 web330 web331 web332 web333 先在自己的服务器写上代码 <?php$content $_GET[1]; if(isset($content)){file_put_contents(flag.txt,$content); }else{echo no data input; }要拿到管理员的cookie , 而…

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日&#xff0c;国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱&#xff0c;共涉及七大类别&#xff0c;127个细分领域。全面展现了网络安全产业的构成和重要组成部分&#xff0c;探…

【虚幻引擎】C++网络通信TCP和HTTP实战开发全流程,以接入科大讯飞星火大模型和文心一言千帆大模型为案例讲解

本套课程介绍了使用我们的虚幻C去写开发我们的插件开发&#xff0c;如何使用我们的虚幻C 封装我们的TCP和HTTP&#xff0c;如何使用的我们虚幻C子系统&#xff0c;如何根据第三方文档去写接口请求&#xff0c;如何通过我们的加密算法去签名我们的URL&#xff0c;如何声明我们的…

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

接上一篇 通义千问AI模型对接飞书机器人-模型配置&#xff08;2-1&#xff09; 1、通过飞书机器人对接ai的在线接口 参考文档&#xff1a;发送 HTTP 请求 1.1 创建飞书应用 创建流程 配置http请求 http请求地址上一篇百炼平台配置的应用地址 1.2 企业自建应用对接AI 添加应用…

判断用户输入IP的合法性判断输入IP与本机IP是否在同一网段C++QT

目录 一、任务目标 二、判断用户输入IP的合法性 三、判断用户输入IP与本机IP是否在同一网段 一、任务目标 1、判断用户输入IP的合法性&#xff0c;例如是否不符合IP地址的正确格式&#xff1b; 2、判断用户输入IP与本机IP是否在同一网段&#xff1b; 3、使用C和QT实现&…

Nacos 服务发现(订阅)源码分析(服务端)

前言&#xff1a; 前文我们分析了 Nacos 服务发现&#xff08;订阅&#xff09;的流程&#xff0c;从 Nacos Client 端的源码分析了服务发现的过程&#xff0c;服务发现最终还是要调用 Nacos Server 端来获取服务信息&#xff0c;缓存到客户端本地&#xff0c;并且会定时向 Na…

HumanitZ人道主义z用服务器开服教程

1、登录服务器&#xff08;百度莱卡云&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、修改查询端口 点击网络&#xff0c;两个端口已经创建完成 复制不是首选的端口&#xff…

入门 git

目录 文章简介1. git 是什么2. 为什么要用 git3. git 入门操作4. git 的来源简述&#xff08;拓展&#xff09; 文章简介 本篇文章主要介绍命令行下的 git 的入门操作&#xff08;本地 – 远端仓库的推送拉取&#xff09;&#xff0c;以及简单理解什么是 git&#xff0c; 为什…

无需标注即可训练,自监督学习框架实现大量未标注毫米波雷达数据预训练自动驾驶感知任务

Abstract 由于雷达&#xff08;radar&#xff09;在雾天和恶劣天气下的操作能力&#xff0c;自动驾驶车辆使用雷达进行感知引起了越来越多的研究兴趣。然而&#xff0c;训练雷达模型受到大规模雷达数据注释的成本和难度的阻碍。为了克服这一瓶颈&#xff0c;我们提出了一种自监…

python pandas处理股票量化数据:笔记4

更新日线数据到最新日期&#xff0c;下面是深发展&#xff08;平安银行&#xff09;更新到20240715以后的stock_daily表。因为积分不够&#xff0c;无法下载tushare.pro接口的通用复权行情数据&#xff0c;只能使用旧的日线数据接口pro.daily&#xff0c;下载的数据没有日线复权…

驱动开发系列04-中断处理

目录 一:概述 二:启用中断 三:注册中断处理程序 四:自动检测中断号 五:快中断与慢中断 六:中断处理程序 七:处理参数和返回值 八:禁用中断 九:上半部和下半部 Tasklets Workqueues 十:共享中断 一:概述 虽然有时候只需使用I/O端口就能控制设备了,但大多…

事务失效的几种情况

一、事务管理的基本概念 事务有四个重要特性&#xff0c;称为ACID特性&#xff1a; Atomicity(原子性)&#xff1a;事务中的所有操作要么全部完成&#xff0c;要么全部不完成。Consistency(一致性)&#xff1a;事务完成后&#xff0c;数据要处于一致的状态Isolation(隔离性)&…

如何在电脑上演示手机上APP,远程排查移动端app问题

0序&#xff1a; 对接客户&#xff0c;给领导演示移动端产品&#xff0c;或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏&#xff0c;但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频&#xff0c;十分繁琐…

Windows图形界面(GUI)-DLG-C/C++ - 滑动条(Trackbar)

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​​​​链接点击跳转博客主页 目录 滑动条(Trackbar) 使用场景 初始控件 控件消息 示例代码 滑动条(Trackbar) 使用场景 音量控制 亮度调节 视频播放进度控制 任何需要用户在特定范围内选择值的场景 初始控…

恶补,先验分布,后验分布 ,似然估计

恶补&#xff0c;打一遍增加印象 先验分布后验分布&#xff0c;似然估计 声明&#xff1a;仅记录个人学习&#xff0c;并无其他用途。 先验分布 后验分布&#xff0c; 似然估计 隔壁小哥的故事&#xff1a; 隔壁小哥要去15公里外的一个公园里玩&#xff0c;小哥可以选择步行…

【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…

离散型随机变量为何不是左连续?

目录 离散型随机变量 引言 离散型随机变量的定义和性质是什么&#xff1f; 定义 性质 如何证明离散型随机变量的分布函数在每个可能取值处不具有左连续性&#xff1f; 离散型随机变量的阶梯状分布函数是如何影响其左连续性的&#xff1f; 在统计学中&#xff0c;有哪些方…