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

内容介绍

给定一个仅包含数字 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,一经查实,立即删除!

相关文章

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;探…

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

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

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

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

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

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

事务失效的几种情况

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

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

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

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

恶补&#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 欢迎来到我…

微信小程序-自定义组件生命周期

一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值&#xff0c;但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…

Gitee 使用教程1-SSH 公钥设置

一、生成 SSH 公钥 1、打开终端&#xff08;Windows PowerShell 或 Git Bash&#xff09;&#xff0c;通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key" 随后摁三次回车键&#xff08;Enter&#xff09; 2、查看生成的 SSH…

React学习笔记(井字棋游戏)

本教程将引导你逐步实现一个简单的井字棋游戏&#xff0c;并且不需要你对 React 有任何了解。在此过程中你会学习到一些编写 React 程序的基本知识&#xff0c;完全理解它们可以让你对 React 有比较深入的理解。 教程分成以下几个部分&#xff1a; 配置 是一些准备工作。 概…

【Linux服务器Java环境搭建】010在linux中安装Redis,以及对Redis的配置与远程连接

系列文章目录 【Linux服务器Java环境搭建】 前言 好久没有更新博客了&#xff0c;今天下了班回到家&#xff0c;看到电脑桌上尘封已久的《Spring Boot应用开发实战》&#xff0c;翻开目录想起来之前写的系列【Linux服务器Java环境搭建】还未完结&#xff0c;那就继续吧&#…

实现异步天气数据获取与Spring缓存集成

你好呀&#xff0c;我是小邹。 在Web应用中&#xff0c;实时天气数据的获取是一个常见的需求&#xff0c;特别是在需要频繁更新天气信息的场景下&#xff0c;如旅游网站、天气应用或任何需要展示地理位置相关天气的应用。然而&#xff0c;频繁的外部API调用不仅会增加服务器的…

生成式AI的未来:对话的艺术与代理的实践

生成式 AI 的发展方向&#xff0c;是 Chat 还是 Agent&#xff1f; 随着生成式AI技术的不断进步&#xff0c;关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统&#xff08;Chat&#xff09;中展现智慧&#xff0c;还是在自主代理&#xff08;Agent&#x…

HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录 HDU1011——Starship Troopers&#xff08;树形DP&#xff09; 题目描述 运行代码 代码思路 树形DP HDU1012——u Calculate e 题目描述 运行代码 代码思路 HDU1013——Digital Roots 题目描述 超时代码 改进后依旧超时代码 运行代码 代码思路 HDU1011——…

前端转base64格式的字体图标方法

1.将需要的字体图标包下载到本地 2.访问 transfonter.org 将字体图标转成base64格式 如 这样就可以和正常的字体图标一样使用了

【Git】Git Submodules 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)

Git Submodules 介绍 1、为什么你值得读这篇文章&#xff1f;2、为什么有 submodules&#xff1f;3、了解 Git Submodules3.1、如何让一个Git仓库变为另一个Git仓库的 submodule3.2、submodule 的父子关系存在哪里3.3、submodule 的父子关系信息怎么存 4、submodule 开发常用操…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…

永远向有结果的人学习!

生活是一场漫长的旅程&#xff0c;充满了挑战和机遇。在这个过程中&#xff0c;我们不断地学习、成长&#xff0c;并从他人的经验中汲取智慧。今天&#xff0c;我想和大家分享一个重要的生活哲学&#xff1a;永远向有结果的人学习。 1. 敢于顶撞与撒野 我依旧敢和生活顶撞&am…