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

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

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

相关文章

docker部署docker运维工具

简介 主要功能:管理容器,管理镜像,管理容器网络 安装 拉取镜像 docker pull joinsunsoft/docker.ui:1.0.1 启动容器 docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 10039:8999 joinsunsoft/docker.ui:1.0.1 使用 打…

基于鲸鱼优化的knn分类特征选择算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 鲸鱼优化算法&#xff08;WOA&#xff09; 4.1.1 包围猎物 4.1.2 螺旋式搜索 4.1.3 更新策略 4.2 K近邻&#xff08;KNN&#xff09;分类器 4.3 基于WOA的KNN分类特征选择算法 5.完…

将Juniper虚拟防火墙vSRX导入EVE-NG

正文共&#xff1a;555 字 8 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们已经简单介绍了如何导入vSRX的VMware镜像到Workstation&#xff08;Juniper虚拟防火墙vSRX部署初体验&#xff09;&#xff0c;如何导入ESXi并简单操作WEB配置&#xff08;将Juniper虚拟防火…

【计算机网络基础篇】学习笔记系列之一《TCP/IP 网络模型》

文章目录 1、问题提出2&#xff0c;网络协议是分层的3&#xff0c;应用层4&#xff0c;传输层5&#xff0c;网络层6&#xff0c;网络接口层7&#xff0c;总结 1、问题提出 为什么要有 TCP/IP 网络模型&#xff1f; 不同设备上的进程间通信需要通过一套通用的网络协议进行网络通…

第二证券:北向资金连续第五日净流入,茅台、工行、五粮液等获加仓

沪指低收险守2700点关口&#xff0c;北向资金接连5日净流入。 2月5日&#xff0c;A股三大股指团体低开&#xff0c;三大股指均创阶段性新低后反弹&#xff0c;创业板指午后首先翻红且一度涨超3%&#xff0c;深成指和沪指也相继转涨。但商场做多情绪欠安&#xff0c;沪深股指重…

opensatck中windows虚拟机CPU核数显示异常问题处理

文章目录 一、问题描述二、元数据信息三、以32核的实例模版为例3.1 单槽位32核3.2 双槽位32核 总结 一、问题描述 openstack创建windows虚拟机的时候&#xff0c;使用普通的实例模版会出现CPU数量和实例模版不一致的问题。需要定制元数据才可以正常显示。 帖子&#xff1a;htt…

米贸搜|关于Facebook广告受限:在这些情况下,Meta会限制广告主的广告能力!

如果你被限制了投放广告&#xff0c;那么你会在Facebook上收到通知。 除了审查广告之外&#xff0c;Meta还监控和调查广告主在Meta技术上的行为&#xff0c;在某些情况下&#xff0c;Meta可能会对广告主施加限制&#xff0c;限制广告主的广告能力&#xff0c;这些限制旨在帮助保…

ChatGPT高效提问—prompt基础

ChatGPT高效提问—prompt基础 ​ 设计一个好的prompt对于获取理想的生成结果至关重要。通过选择合适的关键词、提供明确的上下文、设置特定的约束条件&#xff0c;可以引导模型生成符合预期的回复。例如&#xff0c;在对话中&#xff0c;可以使用明确的问题或陈述引导模型生成…

macbookpro和macbookair的区别?cleanmymac 怎么清理mac空间

苹果mac air和pro区别有&#xff1a;1、air采用了轻薄的设计&#xff0c;重量相对较轻&#xff0c;便于携带&#xff0c;而pro更加注重性能&#xff0c;所以比较重&#xff1b;2、air通常搭载较低功耗的处理器内存和存储容量相对较小&#xff0c;而pro配备了更强大的处理器、更…

基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听长按快捷键addEventListener("keydown", this.keydown);addEventListener("keyup", this.keyup);},destroyed(d) {//移除长按快捷键removeEventListener(&…

外汇天眼:外汇中的“直接套汇”是指什么?

外汇中的直接套汇又称地点套汇和两角套汇&#xff0c;由于两间汇率高低不同&#xff0c;同时在两个市场上买贱卖贵&#xff0c;从中赚取汇率差额。 例如&#xff1a;英镑的价格在伦敦较贵&#xff0c;或者说英镑在纽约就较便宜&#xff0c;而美元的价值在伦敦较便宜&#xff0c…

计算机毕业设计 | SpringBoot大型旅游网站 旅行后台管理系统(附源码)

1&#xff0c; 概述 1.1 项目背景 随着互联网技术的快速发展和普及&#xff0c;旅游行业逐渐转向线上&#xff0c;越来越多的游客选择在线预订旅游产品。传统的线下旅行社模式已不能满足市场需求&#xff0c;因此&#xff0c;开发一个高效、便捷的旅游网站成为行业的迫切需求…

算法-2-异或运算

按位异或&#xff1a;相同为0&#xff0c;不同为1 异或运算性质 1&#xff09;异或运算就是无进位相加&#xff08;ab写二进制形式每位相加时不进位&#xff09; 2&#xff09;异或运算满足交换律、结合律&#xff0c;也就是同一批数字&#xff0c;不管异或顺序是什么&#…

Stable Diffusion 模型下载:majicMIX lux 麦橘辉耀 - V3

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 非常推荐的一个非常绚丽的科幻、梦幻、玄幻般的大模型&#xff0c;由国人“Merjic”发布&#xff0c;下载量颇高。这个模型风格炸裂&#xff0c;远距离脸部需要inp…

071:vue中过滤器filters的使用方法(图文示例)

第071个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

gem5学习(17):ARM功耗建模——ARM Power Modelling

目录 一、Dynamic Power States 二、Power Usage Types 三、MathExprPowerModels 四、Extending an existing simulation 五、Stat dump frequency 六、Common Problems 官网教程&#xff1a;gem5: ARM Power Modelling 通过使用gem5中已记录的各种统计数据&#xff0c;…

《动手学深度学习(PyTorch版)》笔记7.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

闲聊电脑(5)装个 Windows(一)

​夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次说到硬盘分区和格式化&#xff0c;弄完之后&#xff0c;就该装系统了吧&#xff1f; 冰箱&#x…

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS&#xff0c;可以创建易于修改和编辑的规则&#xff0c;且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分&#xff1a;选择器和声明块&#xff1b;声明块由一…

算法:最小循环子数组

一、算法描述 给定一个由若干整数组成的数组nums&#xff0c;请检查数组是否是由某个子数组重复循环拼接而成&#xff0c;请输出这个最小的子数组。 输入描述 第一行输入数组中元素个数n&#xff0c;1 < n < 100000 第二行输入数组的数字序列nums&#xff0c;以空格分割&…