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.hqwc.cn/news/458982.html

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

相关文章

next项目页面性能调优

next项目页面性能调优 一般来说性能优化可以分为加载时、运行时两部分的优化。 扩展参考链接&#xff1a; 前端性能优化 24 条建议 Webpack 4进阶–从前的日色变得慢 &#xff0c;一下午只够打一次包 Webpack 分包优化首屏加载 参考指标 FCP&#xff08;First Contentful P…

hadoop学习笔记

下载安装伪分布式&#xff1a; 1. 国内源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ Index of /apache/hadoop/commonhttps://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ https://mirrors.tuna.tsinghua.edu.cn/apache/hado…

上海泗博HART转ModbusTCP网关HME-635应用案例之组态王和超声波液位计通信

如今工业现场的应用也逐渐把现场的不同应用协议转换成以太网&#xff0c;以此来提升现场的通信速度和质量。Modbus TCP是工业以太网协议的一种&#xff0c;也是现场应用中最常使用的。本应用案例是基于Modbus TCP的组态王和基于HART的超声波液位计之间数据通讯的具体应用。 应用…

【芯片设计- RTL 数字逻辑设计入门 11.2 -- 状态机实现 移位运算与乘法 2】

文章目录 移位运算与乘法parameterparameter 特点parameter 基本语法parameter 示例局部参数局部参数示例 状态机代码实现VCS 仿真结果 文章 【芯片设计- RTL 数字逻辑设计入门 11.1 – 状态机实现 移位运算与乘法 1】 介绍了状态机&#xff0c;本篇文章主要就是使用状态机的方…

c语言--指针数组(详解)

目录 一、什么是指针数组&#xff1f;二、指针数组模拟二维数组 一、什么是指针数组&#xff1f; 指针数组是指针还是数组&#xff1f; 我们类比一下&#xff0c;整型数组&#xff0c;是存放整型的数组&#xff0c;字符数组是存放字符的数组。 那指针数组呢&#xff1f;是存放…

idea中git提交代码出现:commit and push checks failed

参考&#xff1a;https://blog.csdn.net/qq_46548855/article/details/126506747

使用dbeaver导入Excel到mysql数据库

最近业务需要将Excel导入到mysql数据库中&#xff0c;之前一直用的heisql&#xff0c;但是heidisql的导入功能太弱了&#xff0c;后来用了dbeaver&#xff0c;功能很强大。 一、安装dbeaver 首先去官网下载dbeaver社区版&#xff0c;社区版免费&#xff1a;dbeaver.io/ dbea…

《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)

文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例2.1.3 拓展案例 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例2.2.3 拓展案例 2.3 索引设计原则2.3.1 基础知识2.3.2 重点案例2.3.3 拓展案例 2.1 规划高效的数据库架构 在开启我们的数据库设计之旅之前&a…

牛客——牛可乐的翻转游戏(状压,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 牛可乐发明了一种新型的翻转游戏&#xff01; 在一个有 nnn 行 mmm 列的棋盘上&#xff0c;每个格子摆放有一枚棋子&#xff0c;每一枚棋子的颜色要么是黑色&#xff0c;要么是白色。…

C语言:函数

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、函数的概念 数学中我们见过函数的概念&#xff0c;例如ykxb&#xff0c;k和b都是常数&#xff0c;给任意一个x就可以得到y 而C语言也引入了函数&#xff08;function&#xff09;这个概念&#xff0c;C语…

Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

面向对象学习4. 面向对象三大特征 1封装&#xff1a;高内聚(内部细节自己用&#xff0c;外部不能介入)&#xff0c;低耦合(保留很少接口给外部使用)&#xff0c;信息隐藏&#xff08;禁止外界直接访问内部数据(private)&#xff0c;如需要&#xff0c;可通过get/set接口访问&a…

1Panel面板如何安装并结合内网穿透实现远程访问本地管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…