从零学算法17

17.给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

  • 首先我们根据每个按键对应的字母先创建一个二维字符数组 tab。分析题目,每个按键对应几个字符,那么当我们组合时,比如示例 1,“2” 对应的字符为 [a,b,c],即我们在组合时,首位可以为这三种可能,在这三种可能的基础上,我们继续延伸,3 对应为 def,即我们从之前的三种可能可以再分别延伸出三种可能,比如最开始选 a,就能得到 [ad,ae,af],最开始选 b 就能得到 [bd,be,bf]…。我们可以发现这样从一种可能延伸出其他可能,就像是一棵 n 叉树,只不过根节点的值为空字符。那么我们就 bfs 这棵树得到所有可能。我们用一个 list 从尾部存储结果,取的时候从头取。如果头部的拼接字符串已经等于 digits 的长度了,说明每种可能都拼接完毕。
  • 可以代入例子 1 分析以下代码,res 的变化会经历 [] -> [a,b,c] -> [b,c,ad,ae,af] -> [c,ad,ae,af,bd,be,bf] -> [ad,ae,af,bd,be,bf,cd,ce,cf]
  •   public List<String> letterCombinations(String digits) {LinkedList<String> res = new LinkedList<>();//空判断if (digits == null || digits.isEmpty())return res;// 按键对应表char[][] tab = {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'},{'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r', 's'},{'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}};// 空字符根节点入队res.add("");while(res.peek().length() != digits.length()){String remove = res.poll();//出队// 根据当前拼接字符(或者说当前节点的值)可以判断出我们需要拼接第几个字符// 比如最开始为空字符,说明我们要为其拼接第一个字符// 它对应的字符为 digits.charAt(remove.length())// 由于字符是从 2-9,但是我们的对应表数组下标从 0 开始// 即比如字符 2 对应的是 tab[0]// 所以这个字符对应的可能选项为:// tab[digits.charAt(remove.length()) - '2']char[] chars = tab[digits.charAt(remove.length()) - '2'];// 拼接每种可能再入队for(int i=0;i<chars.length;i++){res.add(remove+chars[i]);}}return res;}
    
  • 既然可以 bfs,那么我们难免会想到用 dfs,还是一样的原理,这里的递归终止条件就是得到一种可能,我们就记录并 return,否则还是根据不同的可能性递归。
  • 其实按道理这个逻辑是回溯,所以需要撤销操作,比如我们得到了 ad 后应该复位成 a,再得到 ae->a->af,然后复位成空字符串,继续得到 b->bd->b->be...,否则你可能得到 ad 以后,别的递归部分使用到的 str 就是从 ad 开始拼接得到比如 ade、adef,但是由于递归时每个字符串都是新的对象,不会污染每个可能性分支,也就不用撤销操作了
  •   LinkedList<String> res = new LinkedList<>();char[][] tab = {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'},{'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r', 's'},{'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}};String digits;public List<String> letterCombinations(String digits) {// 防空if (digits == null || digits.isEmpty())return res;this.digits = digits;dfs("");return res;}public void dfs(String str){if(str.length() == digits.length()){res.add(str);return;}char[] chars = tab[digits.charAt(str.length()) - '2'];for(int i=0;i<chars.length;i++){dfs(str+chars[i]);}}
    

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

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

相关文章

Java进击框架:Spring-Web(八)

Java进击框架&#xff1a;Spring-Web&#xff08;八&#xff09; 前言DispatcherServlet拦截器异常视图解析重定向转发 语言环境日志 过滤器带注释的控制器声明映射请求其它注解验证 功能性端点URI Links异步请求CORSHTTP缓存视图技术MVC配置其他Web框架 前言 Spring Web MVC是…

519基于单片机的自动切割流程控制系统

基于单片机的自动切割流程控制系统[proteus仿真] 自动切割流程控制系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于单片机的自动切割流程控制系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&…

无人驾驶卡尔曼滤波

无人驾驶卡尔曼滤波&#xff08;行人检测&#xff09; x k a x k − 1 w k x_k ax_{k-1} w_k xk​axk−1​wk​ w k w_k wk​&#xff1a;过程噪声 状态估计 估计飞行器状态&#xff08;高度&#xff09; x k z k − v k x_k z_k - v_k xk​zk​−vk​ 卡尔曼滤波通…

了解什么是UV纹理?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 什么是UV&#xff1f; UV 是与几何图形的顶点信息相对应的二维纹理坐…

CentOS找回root密码

很悲伤&#xff0c;你忘记了root密码。。。 那就来重置它吧~ 1、在启动时选择操作系统&#xff1a;在引导过程中&#xff0c;选择CentOS操作系统并按下键盘上的任意键来停止引导。 2、 进入编辑模式&#xff1a;在启动菜单中&#xff0c;找到并选择要编辑的CentOS条目&…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

VMware复制粘贴共享文件夹

win和虚拟机之间&#xff0c;无法复制粘贴&#xff0c;共享文件夹的解决方案。 安装VMware tools 1&#xff0c;先检查虚拟机设置部分。共享文件夹已启用。复制粘贴已启用。 2&#xff0c;安装tools.选择重新安装VMware tools. (此图片为安装过的截图) 成功后会显示如图。…

【2024最新-python3小白零基础入门】No1.python简介以及环境搭建

文章目录 一 python3 简介二 python语言的特点三 python安装四 安装开发工具-pycharm五 新建一个python项目1.新建项目2 配置虚拟环境3 运行项目 一 python3 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

批量置入视频封面:一分钟教程,简单易学

在视频制作过程中&#xff0c;为视频添加引人注目的封面是吸引观众的关键。而当我们需要批量处理多个视频时&#xff0c;如何快速、准确地置入封面就显得尤为重要。本文将为您揭示这一高效技巧&#xff0c;让您在一分钟内学会批量置入视频封面&#xff0c;提升视频的吸引力与观…

vite 如何设置 pwa,让网页类似 app 那样运行,使用插件 vite-plugin-pwa

vite 如何设置 pwa&#xff0c;让网页类似 app 那样运行&#xff0c;使用插件 vite-plugin-pwa 一、概述 情况还是那么个情况&#xff0c;还是原来的项目 vue2 改为 vitetsvue3 遇到的问题&#xff0c;今天这个问题是如何 在 Vite 环境下设置 PWA。 PWA 就是网页应用可以像 a…

java是值传递还是引用传递

1.前言 java是值传递&#xff1b;值传递是指在调用方法时将实际参数拷贝一份传递到方法中&#xff0c;这样在方法中如果对参数进行修改&#xff0c;将不会影响到实际参数&#xff1b;当传的是基本类型时&#xff0c;传的是值的拷贝&#xff0c;对拷贝变量的修改不影响原变量&a…

krpano官网文档翻译-------krpano Action脚本参考文档【krpano Actions / Scripting Reference】

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 摘要:本文通过大量代码案例,手把手教你如何使用krpano的Action脚本实现各种交互控制和酷炫…

OpenAI ChatGPT-4开发笔记2024-01:开发环境

ChatGPT发展一日千里。工具、函数少则数日&#xff0c;多则数月就加入了Deprecated行列不再如预期般工作。元旦闲来无事&#xff0c;用最新的ChatGPT重写一下各种开发场景&#xff0c;全部实测通过。 开发环境&#xff1a; 电脑&#xff1a;两台笔记本&#xff1a;HP和MacBoo…

服务端性能测试——性能测试体系

目录&#xff1a; 1.性能测试介绍 性能测试介绍性能体系&#xff1a;性能测试与分析优化&#xff1a;行业流行性能压测工具介绍行业流行性能监控工具介绍行业流行性能剖析工具介绍性能测试流程与方法性能测试计划 计划&#xff1a;DAU&#xff0c;PV(perday)&#xff0c;订单量…

HTTP 3xx状态码:重定向的场景与区别

HTTP 状态码是服务器响应请求时传递给客户端的重要信息。3xx 系列的状态码主要与重定向有关&#xff0c;用于指示请求的资源已被移动到不同的位置&#xff0c;需要采取不同的操作来访问。 一、301 Moved Permanently 定义&#xff1a; 服务器表明请求的资源已永久移动到一个新…

Fluids —— Volume VOP

P&#xff0c;当前体素位置&#xff1b;density&#xff0c;此场的值&#xff1b;ix, iy, iz&#xff0c;体素索引&#xff08;0 ~ res-1&#xff09;&#xff1b;resx, resy, resz&#xff0c;当前volume的精度&#xff1b;center&#xff0c;当前volume的中心点&#xff1b;o…

STM32入门教程-2023版【3-3】gpio输入

关注 星标公众号 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 上两小节我们已经把GPIO的结构和8种输入输出模式都讲完了&#xff0c;到这里还不懂的可以回…

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序&#xff1a; 2、ITP新建工程&#xff1a; 3、依次选择&#xff0c;最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来&#xff0c;地址绑定&#xff1a;M1 6、地址绑定&#xff1a;Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

力扣——C语言:合并两个有序数组

88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题有多种方法可以解决 一、暴力求解 这种方法最简单&#xff0c;我们只需要把两个数组合在一起然后在冒泡排序就可以了 代码如下&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2…

Redis 过期删除策略

常见的三种过期删除策略&#xff1a; 定期删除&#xff1b;惰性删除&#xff1b;定时删除&#xff1b; 定期删除策略 每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查&#xff0c;并删除其中的过期key。 定期删除的实现在 expire.c 文件下的 activeExpireCycle …