从零学算法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,一经查实,立即删除!

相关文章

【Spring】容器

注意点&#xff1a; p命名和c命名空间不能直接使用&#xff0c;需要导入xml约束&#xff01; xmlns:p"http://www.springframework.org/schema/p" xmlns:c"http://www.springframework.org/schema/c"使用注解实现自动装配 jdk1.5 支持的注解&#xff0c;…

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

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

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

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

【蓝桥备赛】技能升级——二分查找

题目链接 技能升级 个人思路 需要给n个技能添加技能点&#xff0c;无论技能点加成如何衰减&#xff0c;每次始终都是选择当前技能加点加成最高的那一项技能&#xff0c;所以最后一次的加点一定也是加在当时技能攻击加成最高的那个。此时&#xff0c;我们去寻找最后一次的加点…

无人驾驶卡尔曼滤波

无人驾驶卡尔曼滤波&#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​ 卡尔曼滤波通…

JavaScript中表格文件导出功能详解

一、背景 在现代web开发中&#xff0c;提供数据导出功能已成为许多应用程序的必备功能。用户可能希望将数据保存为文件以便于离线查看或分享。在众多的数据展示形式中&#xff0c;表格因其直观性而广受欢迎。本文将专注于如何使用JavaScript将HTML表格导出为文件。 二、实现原…

了解什么是UV纹理?

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

vue element plus Layout 布局

通过基础的 24 分栏&#xff0c;迅速简便地创建布局。 TIP 组件默认使用 Flex 布局&#xff0c;不需要手动设置 type"flex"。 请注意父容器避免使用 inline 相关样式&#xff0c;会导致组件宽度不能撑满。 基础布局# 使用列创建基础网格布局。 通过 row 和 col …

CentOS找回root密码

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

63、图片预处理:Resize and Crop

在进行图像处理之前,很多时候需要对图片先进行预处理,而最常见的预处理方法是 Resize and Crop。 在 resnet50 的实战中,在进行一张图片的推理实验之前,我们也会对输入的图像进行 Resize and Crop 操作。 这一节就介绍下这两个预处理操作。 实际上,Resize and Crop 是两…

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…

PHP数组复习

定义索引数组 $arr[0] 123; //整数 $arr[1] "hello"; //字符串 $arr[2] 45.6; //浮点数 $arr[3] true; //布尔值 $arr[4] null; //null 赋值方式定义关联数组 $arr["id"] 1; $arr["name"] "某某"; $a…

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…

2023职业规划与心灵成长-7年JAVA开发的自我思考

博主是一个知足长乐&#xff0c;安于现状&#xff0c;热爱编程&#xff0c;家庭大于一切 的技术小达人。 19年从一家中型软件公司研发岗跳到了一家小国有企业的IT部&#xff1b;已经4年了&#xff0c;记录下当下历程吧&#xff0c;留给以后得自己看也给目前各位想跳的朋友参考下…

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…