从零学算法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]);
          }
      }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GLTF编辑器实现逼真的石门模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中&#xff0c;每个像素点都包含了一个法线向量&#xff0…

【开源项目】超经典数字孪生智慧物流园

数字孪生物流园管理系统&#xff0c;具有仓储管理智能化、运输管理自动化、物流管理系统化、共享服务平台化等特点。飞渡科技基于数字孪生、物联网IOT、人工智能等新一代信息技术&#xff0c;以智能设备为基底&#xff0c;通过人、物、资源、系统等多方数据的传递和交互&#x…

记一次canal除坑记录

记一次canal除坑记录 错误信息 Caused by :com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table 问题处理 今天对Canal相关程序进行升级&#xff0c;原监听的表及业务都正常&#xff1b;遇到新增加的表时总是不走&#xff1b;…

【第七在线】智能商品系统是否可以帮助预测新品的销售表现?

智能商品系统在鞋服企业商品运营中的应用已经成为一种趋势。随着技术的发展和数据的积累&#xff0c;智能化已经成为企业提高运营效率和市场竞争力的重要手段。其中&#xff0c;智能商品系统通过对大量销售数据的分析&#xff0c;可以帮助预测新品的销售表现&#xff0c;为企业…

Linux驱动(三)platform总线驱动

1、前言 Platform总线是Linux内核中用于管理嵌入式系统中的设备的一种总线类型。它允许设备驱动程序通过一组标准的接口与嵌入式系统中的硬件设备进行通信。 Platform总线维护了一个驱动链表和一个设备链表&#xff0c;当有新的设备添加后会通过自身的match函数遍历驱动链表查…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80 注意点&#xff1a;后续使用的时候会报错 需要手动创…

LeetCode-无重复字符的最长子串(3)

题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 代码&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> occnew HashSet<Character>();int lens.length();int…

Local server not started, start with 报错python -m weditor

一、python -m weditor 如图报错 Local server not started, start with 报错 二、解决方案 右上角选择新的无痕窗口下&#xff0c;然后打开 http://localhost:17310/ 即可

VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。

问题描述&#xff1a;今天打开centos7虚拟机就是直接打不开了报了下面的错误&#xff0c;也没有动任何东西&#xff0c;点确定后&#xff0c;也是依然没有反应 问题原因&#xff1a;可能是虚拟机中的内存满了&#xff0c;需要清理内存 解决方法如下 首先cmd打开终端敲入如下命…

linux磁盘管理实验1

1.在安装好的linux系统中新加一块硬盘&#xff0c;将硬盘分成2个主分区&#xff0c;和2个逻辑分区&#xff0c;将其中一个逻辑分区设置成vfat&#xff08;FAT32&#xff09;分区&#xff0c;并实现开机自动挂载所有分区。 答&#xff1a;添加一个硬盘为sdb 分成2个主分区&#…

LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

文章首发于公众号&#xff1a;机器感知 LLM增强LLM&#xff1b;通过预测上下文来提高文生图质量&#xff1b;Spikformer V2&#xff1b;同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expanding Capabilities through Composition 本文研究了如何高效地组…

面试算法96:字符串交织

题目 输入3个字符串s1、s2和s3&#xff0c;请判断字符串s3能不能由字符串s1和s2交织而成&#xff0c;即字符串s3的所有字符都是字符串s1或s2中的字符&#xff0c;字符串s1和s2中的字符都将出现在字符串s3中且相对位置不变。例如&#xff0c;字符串"aadbbcbcac"可以由…

透明OLED屏制作:工艺与技术挑战

透明OLED屏作为一种前沿的显示技术&#xff0c;其制作过程涉及一系列复杂的工艺和技术挑战。作为一名专注于OLED技术研发的工程师&#xff0c;我将为大家深入解析透明OLED屏的制作过程&#xff0c;以及所面临的挑战。 首先&#xff0c;透明OLED屏的制作过程大致可分为以下几个步…

使用.Net nanoFramework为ESP32进行蓝牙配网

通过前面的介绍&#xff0c;我们已经学会了如何使用 .NET nanoFramework 为 ESP32 设备连接 Wi-Fi 网络。然而&#xff0c;在实际的物联网环境中&#xff0c;我们往往需要使用更便捷的式来满足配网需求。这篇文章将带你了解一些常见的配网方案&#xff0c;并以 ESP32 为例&…

【Java 进阶篇】Nginx 使用详解:搭建高性能的 Web 服务器

在互联网的世界里&#xff0c;Web 服务器是我们访问网站、获取信息的入口。Nginx&#xff08;发音"engine x"&#xff09;作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;因其出色的性能和可扩展性而备受推崇。本文将围绕 Nginx 的使用进行详解&am…

KK集团高管变更:陈世欣任总经理,涉无证放贷遭关注,还曾被处罚

近日&#xff0c;KK集团关联公司广东快客电子商务有限公司&#xff08;下称“KK集团”&#xff09;发生工商变更&#xff0c;其中郭惠波不再担任该公司总经理一职&#xff0c;由陈世欣接任。而在早前&#xff0c;陈世欣曾于2020年取代吴悦宁担任总经理职务&#xff0c;2021年7月…

Linux服务器的几种类型

Linux是一个开源操作系统内核&#xff0c;用作各种Linux发行版&#xff08;也称为“distros”&#xff09;的核心组件。由Linus Torvalds于1991年开发&#xff0c;Linux基于Unix操作系统。它以其稳定性、安全性和多功能性而闻名。 Linux的关键特点&#xff1a; 开源性质&#…

每日一道算法题day-three(备战蓝桥杯)

哈喽大家好&#xff0c;今天来给大家带来每日一道算法题系列第三天&#xff0c;让我们来看看今天的题目&#xff0c;一起备战蓝桥杯 题目&#xff1a; 小 Y的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 11 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…

游戏缺少x3daudio1_7.dll文件怎么办?x3daudio1_7.dll丢失总共有六个解决方法

导语&#xff1a;在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1_7.dll丢失”。那么&#xff0c;x3daudio1_7.dll到底是什么文件呢&#xff1f;它的作用和影响又是什么呢&#xff1f;本文将为您详细介绍x3daudio1_7.dll的相关知…