从零学算法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.hqwc.cn/news/334588.html

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

相关文章

加速科技ST2500 数模混合信号测试设备累计装机量突破500台!

国产数字机&#xff0c;测试中国芯&#xff01;新年伊始&#xff0c;国产半导体测试设备领军企业加速科技迎来了振奋人心的一刻&#xff0c;ST2500 数模混合信号测试设备累计装机量突破500台&#xff01;加速科技凭借其持续的创新能力、完善的解决方案能力、专业热忱的本地化服…

论文阅读:Making Large Language Models A Better Foundation For Dense Retrieval

论文链接 Abstract 密集检索需要学习区分性文本嵌入来表示查询和文档之间的语义关系。考虑到大型语言模型在语义理解方面的强大能力&#xff0c;它可能受益于大型语言模型的使用。然而&#xff0c;LLM是由文本生成任务预先训练的&#xff0c;其工作模式与将文本表示为嵌入完全…

Git将本地项目上传到Gitee仓库

1.右键点击文件&#xff0c;点击Git Bash Here,进入git窗口 2.初始化本地仓库 git init3.将本地仓库与远程仓库建立连接 git remote add origin 远程仓库地址远程仓库地址在gitee仓库复制即可 4.将远程仓库的文件拉到本地仓库中 git pull origin master5.将本地文件全部上传…

RocketMQ5-03RocketMQ-Dashboard和Java客户端访问示例

接上篇02快速部署RocketMQ5.x(手动和容器部署) 已经完成 RocketMQ5.0 环境的部署&#xff0c;就需要对这个环境进行测试&#xff0c;查看集群、写入消息、读取消息等 本篇教你如何使用和查看部署的服务&#xff1a; Docker部署 Dashboard 获取镜像并下载部署服务 客户端连接 …

python画房子

前言 今天&#xff0c;我们来用Python画房子。 一、第一种 第一种比较简单。 代码&#xff1a; import turtle as t import timedef go(x, y):t.penup()t.goto(x, y)t.pendown() def rangle(h,w):t.left(180)t.forward(h)t.right(90)t.forward(w)t.left(-90)t.forward(h) de…

Stable Diffusion 系列教程 - 6 Dreambooth及训练

Stable-Diffusion、Imagen等文生图大模型已经具备了强大的生成能力&#xff0c;假设我们的Prompt为 [Cyberpunk Style]&#xff0c;SD或许能很快画出赛博朋克风格的一幅画。但你作为一个不知名的人&#xff0c;不能奢求SD在训练的时候把你自己想要的风格也加进去吧&#xff1f;…

鸿蒙应用开发学习路线(OpenHarmony/HarmonyOS)

鸿蒙应用开发学习路线&#xff08;OpenHarmony/HarmonyOS&#xff09; HarmonyOS应用开发学习路线网站汇总社区汇总视频学习路线 OpenHarmony应用开发学习路线与资料网站汇总社区汇总学习路线 MarkDown工具推荐 HarmonyOS应用开发学习路线 作者&#xff1a;坚果 团队&#xff1…

Verilog 高级教程笔记——持续更新中

Verilog advanced tutorial 转换函数 调用系统任务任务描述int_val $rtoi( real_val ) ;实数 real_val 转换为整数 int_val 例如 3.14 -> 3real_val $itor( int_val ) ;整数 int_vla 转换为实数 real_val 例如 3 -> 3.0vec_val $realtobits( real_val ) ;实数转换为…

企业级快速开发平台可以用在什么行业?优点多吗?

应用专业的企业级快速开发平台可以带来什么效果&#xff1f;目前&#xff0c;低代码技术平台在很多领域都获得了广泛应用和推广&#xff0c;在实现高效率办公、流程化办公和数字化发展中扮演了非常重要的角色&#xff0c;具有举足轻重的作用。针对这个话题&#xff0c;现在将给…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

Golang中for和for range语句的使用技巧、对比及常见的避坑

前言 基础语法不再赘述&#xff0c;写这个原因是之前的某次面试被问道了&#xff0c;我知道会导致问题但具体答下来不是很通顺。再回想自己开发过程中&#xff0c;很多地方都是使用到了for/for range&#xff0c;但是却从没注意过一些细节&#xff0c;因此专门学习一下进行记录…

解决MySQL8.0本地服务器连接不上的问题

MySQL在同一个内网内&#xff0c;但是他人链接你的MySQL时候提示&#xff1a; Host xxx is not allowed to connect to this MySQL server 这通常是MySQL限制了用户允许访问的IP导致的&#xff0c;我们可以按照下面的步骤来接触这个限制。 办法一 进入mysql的bin目录&#xff…