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

LeetCode、17. 电话号码的字母组合【中等,dfs回溯】

文章目录

  • 前言
  • LeetCode、17. 电话号码的字母组合【中等,dfs回溯】
    • 题目与类型
    • 思路
      • 递归+回溯
      • 优化:StringBuilder来回溯
      • 补充代码:2024.1.31(简化)
  • 资料获取

前言

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


LeetCode、17. 电话号码的字母组合【中等,dfs回溯】

题目与类型

学习:leetcode题解

题目链接:17. 电话号码的字母组合

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

题目类型:搜索与图论/回溯、基础算法/枚举

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


思路

本题是要得到所有电话号码的字母组合,这实际上就是全排列(dfs),其中就包含回溯的一个操作处理,我们可以使用一个临时保留或者尝试使用回溯思路来实现。


递归+回溯

思路:由于循环的个数不确定,则需要使用递归来进行求解。

代码:时间复杂度O(3m×4n)、空间复杂度O(m+n)

class Solution {/*** 根据指定字符生成字符串* @param ch 数字字符* @return*/public String generateNumtoString(char ch){String[] arr = new String[] {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};if (ch - '2' <= arr.length){return arr[ch - '2'];}return null;}private List<String> letters = new ArrayList<>();/*** 全排列 :abc、def、ghip* @param arr 数组集合* @param curIndex 当前要遍历的指定数组* @param curArrIndex 当前排列的个数* @param genStr 当前生成的字符串*/public void quanpailie(String[] arr, int curIndex, int curArrIndex, String genStr){//生成每组的排列个数if(curArrIndex == arr.length){letters.add(genStr);return;}String curArr = arr[curIndex];//取得当前要遍历的数组String temp = genStr; //临时保存原先状态for (int i = 0; i < curArr.length(); i++) { //枚举所有情况genStr += curArr.charAt(i);quanpailie(arr,curIndex + 1, curArrIndex + 1, genStr);genStr = temp; //回溯}}public List<String> letterCombinations(String digits) {if (Objects.equals("",digits)){return new ArrayList<>();}String[] arrs = new String[digits.length()];for (int i = 0; i < digits.length(); i++) {arrs[i] = generateNumtoString(digits.charAt(i));}//使用全排列进行求解quanpailie(arrs,0, 0, "");return letters;}}

image-20211208151438197

小优化:对于回溯操作的字符串替换使用StringBuilder,时间、空间效率大幅度提升!

public void quanpailie(String[] arr, int curIndex, int curArrIndex, StringBuilder str){...for (int i = 0; i < curArr.length(); i++) { str.append(curArr.charAt(i));...str.deleteCharAt(curArrIndex);//回溯优化}
}

优化:StringBuilder来回溯

思路:核心优化点就是在字符串回溯、拼接上

/*** 根据指定字符生成字符串* @param ch 数字字符* @return*/
public String generateNumToStr(char ch){String[] arr = new String[] {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};if (ch - '2' <= arr.length){return arr[ch - '2'];}return null;
}private List<String> letters = new ArrayList<>();/*** 全排列 :abc、def、ghip* @param phones 电话数字映射的字符串数组* @param index 当前排列的数字位置* @param genStr 当前生成的字符串*/
public void quanpailie(String[] phones, int index, StringBuilder genStr){//生成每组的排列个数if(index == phones.length){letters.add(genStr.toString());return;}String curArr = phones[index];//取得当前要遍历的数组for (int i = 0; i < curArr.length(); i++) { //枚举所有情况genStr.append(curArr.charAt(i));quanpailie(phones,index + 1, genStr);genStr.deleteCharAt(index);}
}public List<String> letterCombinations(String digits) {if (Objects.equals("",digits)){return new ArrayList<>();}String[] arrs = new String[digits.length()];for (int i = 0; i < digits.length(); i++) {arrs[i] = generateNumToStr(digits.charAt(i));}//使用全排列进行求解quanpailie(arrs,0, new StringBuilder(""));return letters;
}

image-20211208153059789

补充代码:2024.1.31(简化)

class Solution {List<String> res = new ArrayList<>();//"23"public List<String> letterCombinations(String digits) {if ("".equals(digits)) return res;//2-9String[] phones = {"abc","def","ghi","jkl", "mno","pqrs","tuv","wxyz"};List<String> phoneList = new ArrayList<>();for (int i = 0; i < digits.length(); i++) {char ch = digits.charAt(i);int num = ch - '0';if (num < 2) continue;phoneList.add(phones[num - 2]);}dfs (0, digits.length(), new StringBuilder(),  phoneList);return res;}public void dfs (int curLevel, int allLevel, StringBuilder str, List<String> phoneList) {//若是层数已经超越了原本的电话拨号数,那么直接添加到集合中if (curLevel >= allLevel) {res.add(str.toString());return;}//当前层编号String phones = phoneList.get(curLevel);for (int i = 0; i < phones.length(); i++) {str.append(phones.charAt(i));dfs (curLevel + 1, allLevel, str, phoneList);str.deleteCharAt(str.length() - 1);//回溯}}
}

image-20240131145824770


资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 时间:2024.1.31

相关文章:

LeetCode、17. 电话号码的字母组合【中等,dfs回溯】

文章目录 前言LeetCode、17. 电话号码的字母组合【中等&#xff0c;dfs回溯】题目与类型思路递归回溯优化&#xff1a;StringBuilder来回溯补充代码&#xff1a;2024.1.31&#xff08;简化&#xff09; 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博…...

SSRF漏洞给云服务元数据带来的安全威胁

文章目录 前言元数据服务威胁1.1 Metadata元数据1.2 RAM资源管理角色1.3 STS 临时凭据利用1.4 CF云环境利用框架1.5 元数据安全性增强 TerraformGoat2.1 永久性AccessKey2.2 SSRF靶场环境搭建2.3 腾讯云CVM配角色2.4 接管腾讯云控制台 SSRF组合拳案例3.1 上传图片功能SSRF3.2 文…...

【C++】强制类型转换

强制类型转换分为显式和隐式 显式直接用小括号强制转换&#xff0c;float b (int)a; 隐式直接 float b 0.5; int a b; C中更推荐用四个强制类型转换的关键字&#xff1a; 1、static_cast&#xff0c; 2、const_cast&#xff0c; 3、reinterpret_cast&#xff0c; 4、dynami…...

java日志框架总结(四 、JCL日志门面技术)

日志框架出现的历史顺序&#xff1a;Log4j → JUL → JCL → slf4j → logback → log4j2 一、背景 在前面博文中&#xff0c;我们分别讲述了常用的2个日志框架&#xff1a;JUL&#xff08;Java Util Logging&#xff09;、Log4J。那么如何选择使用哪一个呢&#xff1f; 根据项…...

mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题

mfc140.dll是Microsoft Foundation Class (MFC)库中的一个非常重要的DLL文件。它承载了许多被执行程序使用的函数和资源。这个库主要被广泛应用于开发Windows操作系统上的应用程序。然而&#xff0c;有时候我们可能会遭遇到mfc140.dll缺失或损坏的情况&#xff0c;这会导致依赖…...

从一个小故事讲解观察者模式~

定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 什么是观察者模式&#xff1f; 观察者模式在我们的日常生活中极其常见。 先来看看观察者模式的定义&#xff1a; 观察者模式定义了对象之间…...

LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

文章目录 前言LeetCode、1137. 第 N 个泰波那契数【简单&#xff0c;动态规划】题目与分类思路一维动态规划 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…...

Python爬虫urllib详解

前言 学习爬虫&#xff0c;最初的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢&#xff1f;请求需要我们自己来构造吗&#xff1f;需要关心请求这个数据结构的实现吗&#xff1f;需要了解 HTTP、TCP、IP 层的网络传输通信吗&#xff1f;需要知…...

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断&#xff0c;以下是硬件中断的产生到执行完毕的全过程&#xff1a; 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”&#xff0c;中断向量控制器中存储中断元服务地址即处理中断处理程序的地址&#xff0c;而不用使用0X1…...

android tv开发-1,leanback

目录 1.leanback库的一些事 2.leanback在使用时遇到的一些麻烦 视频卡片 页面空白 关于左侧菜单的一些设置 数据加载异常与加载中的一些操作 如果页面无数据,如何显示错误的页面....

chisel RegInit/UInt/U

val reg RegInit(0.U(8.W)) //ok val reg RegInit(0.UInt(8.W)) //errU 使用在数字 . 后边50.U UInt 使用在IO(new Bundle val a Input(UInt(8.W)) 或者 def counter(max:UInt, a1:UInt) package emptyimport chisel3._ import chisel3.util._class MyCounter extends …...

华为OD机试真题-田忌赛马-2024年OD统一考试(C卷)

题目: 给定两个只包含数字的数组a,b,调整数组 a 里面数字的顺序,使得尽可能多的 a[i] >b[i]。数组 a和 b 中的数字各不相同。 输出所有可以达到最优结果的 a 数组的数量 输入描述: 输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a 数组…...

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android&#xff1a;提升Android开发效率与质量的利器 在Android应用开发过程中&#xff0c;开发者常常面临着重复编写基础组件和处理兼容性问题的挑战&#xff0c;这不仅耗费时间&#xff0c;也降低了开发效率。为了解决这一问题&#xff0c;Tencent推出了QMUI_Android框…...

如何部署Linux AMH服务器管理面板并结合内网穿透远程访问

文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管…...

C++文件操作(2)

文件操作&#xff08;2&#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时&#xff0c;也可以读取其中的内容&#xff0c;因为文本文件…...

Bootstrap5 图片轮播

Bootstrap5 轮播样式表使用的是CDN资源 <title>亚丁号</title><!-- 自定义样式表 --><link href"static/front/css/front.css" rel"stylesheet" /><!-- 新 Bootstrap5 核心 CSS 文件 --><link rel"stylesheet"…...

WINDOWS搭建NFS服务器

下载并安装 Networking Software for Windows 启动配置 找到安装目录&#xff08;如C:\Program Files\nfsd&#xff09;&#xff0c;双击nfsctl.exe&#xff0c;菜单Edit->Preferences 启动后&#xff1a; 配置Export Exports->Edit exports file 其他的几句我都删除…...

LeetCode、216. 组合总和 III【中等,组合型枚举】

文章目录 前言LeetCode、216. 组合总和 III【中等&#xff0c;组合型枚举】题目类型与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖…...

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…...

面试 JavaScript 框架八股文十问十答第一期

面试 JavaScript 框架八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;JavaScript有哪些…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...