Leetcode原题电话号码的字母组合的两种解法【BFS-DFS】

news2025/1/5 10:09:26

来源:LeetCode 第17题【公众号:数据结构和算法】

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。

示例1:
输入:d i g i t s = " 2 3 " 
输出:[" a d "," a e "," a f"," b d "," b e "," b f"," cd "," ce "," c f"]


示例2:
输入:d i g i t s = "" 
输出:[ ] 


示例3:
输入:d i g i t s = " 2 " 
输出:[" a "," b "," c "] 

提示:

  0<=digits.length<=4

  digits[]是范围['2' , '9']的一个数字。

解法一:BFS解决

每一个数字对应3到4个字符,我们以示例一为例画个图来看一下

我们看到实际上就是一颗n叉树,除了叶子节点外,每个节点都有3到4个子节点。对于二叉树的BFS遍历如下图所示,也就是一行一行的访问 。

二叉树的BFS遍历代码如下:

public void levelOrder(TreeNode tree) { 
    //链表,这里我们可以把它看做队列 
    LinkedList<TreeNode> list = new LinkedList<>(); 
    list.add(tree);//相当于把数据加入到队列尾部 
    while (!list.isEmpty()) { 
        //poll方法相当于移除队列头部的元素 
        TreeNode node = list.poll(); 
        //访问当前节点 
        System.out.println(node.val); 
        //遍历当前节点的左子节点和右子节点 
        if (node.left != null) 
            list.add(node.left);
        if (node.right != null) 
            list.add(node.right); 
     } 
} 

因为最多有两个子节点所以是二叉树,如果最多有n个子节点我们可以称它为n叉树,那么n叉树的子节点比较多,我们不可能一次性全部写完,可以使用for循环来遍历,代码如下:

public void levelOrder(TreeNode tree) { 
    //链表,这里我们可以把它看做队列 
    LinkedList<TreeNode> list = new LinkedList<>(); 
    list.add(tree);//相当于把数据加入到队列尾部 
    while (!list.isEmpty()) { 
       //poll方法相当于移除队列头部的元素 
        TreeNode node = list.poll(); 
        //访问当前节点 
        System.out.println(node.val); 
        //遍历当前节点的所有子节点 
        for (int i = 0; i < node.child.count; i++) { 
            list.add(node.child[i]); 
        } 
    } 
}

搞懂了上面的代码,那么这题的答案就比较简单了。实际上这题给的并不是一棵树,这棵树只是我们想象的,那我们怎么确定走到叶子节点了呢,实际上很简单,如果有n个 数字,那么叶子节点字符串的长度就应该是n。来看下代码:

//BFS 
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();//出队 
          char[] chars = tab[digits.charAt(remove.length()) - '2']; 
           //相当于当前节点的所有子节点 
            for (int i = 0; i < chars.length; i++) { 
                res.add(remove + chars[i]);//入队 
                } 
        } 
     return res; 
} 

解法二:DFS解决

对于一棵树的遍历,除了BFS以外我们很自然的会想到DFS,这里我们可以把它看做是一棵树的前序遍历。网上说这种是回溯算法,实际上这里往回走的时候并不需要撤销选择,因为字符串每次都会生成一个新的对象,所以并不会造成其他分支的污染;

public List<String> letterCombinations(String digits) { 
    List<String> res = new ArrayList<>(); 
    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'}}; 
    dfs(res, 0, digits, tab, ""); 
    return res; 
} 


/** 
* @param res 
* @param index 表示访问到第几个数字了,也可以认为访问到树的第几层了 
* @param digits 
* @param tab 
* @param path 从根节点到叶子结点的路径 
*/ 

private void dfs(List<String> res, int index, String digits, char[][] tab, String path) { 
    //到叶子节点了,就把这条路径选择的字符添加到res中 
    if (path.length() == digits.length()) { 
        res.add(path);
        return; 
    } 
    char[] chars = tab[digits.charAt(index) - '2']; 
    //访问当前节点的所有子节点 
    for (int i = 0; i < chars.length; i++) { 
        dfs(res, index + 1, digits, tab, path + chars[i]); 
            //因为字符串是创建了一个新的对象,所以这里不需要撤销 
      } 
}

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

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

相关文章

浅析分布式数据库

前言 随着信息技术的迅猛发展&#xff0c;各行各业产生的数据量呈爆炸式增长&#xff0c;传统集中式数据库的局限性在面对大规模数据处理中逐渐显露&#xff0c;从而分布式数据库应运而生。分布式数据库是在集中式数据库的基础上发展起来的&#xff0c;是分布式系统与传统数据…

java刷题day 06

一. 单选题&#xff1a; 解析&#xff1a;最终类也叫密封类&#xff0c;是被final修饰的类&#xff0c;不能被继承 解析&#xff1a; A&#xff1a;6入&#xff0c;5 入&#xff0c;5出&#xff0c;4入&#xff0c;4出&#xff0c;3入&#xff0c;3出&#xff0c;6出&#xff0…

SpringBoot 封装 HBase 操作工具类

最近项目中用到了Hbase相关的操作并封装成工具类&#xff0c;我的Hbase服务器端版本是2.1.0&#xff0c;图示如下&#xff1a; 特此记录便于日后查阅。 一、pom.xml 依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-shaded-…

【C++】快速入门list的使用

文章目录一、引入二、构造三、迭代器四、增删查五、其他操作一、引入 list的本质是带头双向循环链表&#xff0c;对于带头双向循环链表我们可是比较熟悉的了。本文只对list的一些常用接口进行说明&#xff0c;对于其他一些接口可自行查看文档。 二、构造 void Test() {list<…

Simple Black-box Adversarial Attacks

Abstract 我们提出了一种有趣的简单方法&#xff0c;用于在黑盒环境中构建对抗性图像。 与白盒场景相比&#xff0c;构建黑盒对抗图像对查询预算有额外的限制&#xff0c;而有效的攻击至今仍是一个悬而未决的问题。 仅在连续值置信分数的温和假设下&#xff0c;我们的高效查询…

2022 计网复习简答题【太原理工大学】

考虑到在此期间&#xff0c;我可能也会发表一些与考试不相关的博文&#xff0c;为了避免大家错过考试相关内容&#xff0c;我特意弄了一个专栏《期末复习汇总》&#xff0c;大家以后可以直接到专栏里面去寻找期末复习资料。这里是计算机网络考试简答题总结&#xff0c;其余题型…

资本+商业模式+中国制造的出海跨境电商,走向世界!(Starday)

近年&#xff0c;伴随着新冠疫情的爆发&#xff0c;海外的社交隔离以及中国面对境外入关者的严格隔离政策都给中国投资者的出海投资踩下了刹车&#xff0c;出国考察及尽调都分外的艰难。但也因为这样的国际局势&#xff0c;跨境电商服务行业在海外疫情的催化下&#xff0c;中国…

PyTorch学习笔记-Non-linear Activations与Linear Layers

1. Non-linear Activations 非线性激活函数官方文档&#xff1a;Non-linear Activations。 有深度学习基础的同学应该知道最常用的非线性激活函数就是 ReLU 和 Sigmoid 函数&#xff0c;多分类问题会在输出层使用 Softmax 函数。这三个函数在 PyTorch 中分别为 nn.ReLU、nn.S…

推特自动发帖,快速提升人气

Twitter一直是所有类型企业和品牌的极其宝贵的营销工具。如果使用得当&#xff0c;它本身就能成为一种高效的营销工具。Twitter与其他社交媒体渠道&#xff0c;在营销策略以及工作方式方面略有不同&#xff0c;在品牌营销方面与利用Twitter做推广&#xff0c;就意味着随着您的动…

NNDL 作业10:第六章课后题(LSTM | GRU)

文章目录习题6-3 当使用公式(6.50)作为循环神经网络得状态更新公式时&#xff0c;分析其可能存在梯度爆炸的原因并给出解决办法.习题6-4 推导LSTM网络中参数的梯度&#xff0c;并分析其避免梯度消失的效果习题6-5 推导GRU网络中参数的梯度&#xff0c;并分析其避免梯度消失的效…

[附源码]Python计算机毕业设计Django餐馆点餐管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Apple ID 登录

Apple登录可以看做第三方登录的一种&#xff0c;即使用Apple ID登录&#xff0c;前提是你已经有了苹果开发者账号&#xff0c;直接进入主题吧。 添加App IDs 填写Bundle ID 勾选“Sign In with Apple” 创建Key 苹果将使用公钥/私钥对作为OAuth客户端机密&#xff0c;其中客…

【mongodb】重新整理mongodb中的各种操作

目录前言初始化封装基础方法增&#xff1a;向集合内添加一个文档增&#xff1a;向集合内一次添加多条文档删&#xff1a;删除一条文档删&#xff1a;删除多条文档删&#xff1a;清空某个集合的所有文档查&#xff1a;查询符合条件的文档查询某个集合内所有文档&#xff1a;定位…

python>>numpy(第二讲)

章节内容 元素操作 常用的方法 广播 数组形状操作 排序数组 目录 元素操作 一些常用的方法 广播 数组形状操作 数组排序 元素操作 生成元素a np.array([1,2,3,4]) b np.ones(4)1 生成一个原来数组的n倍生成一个所有元素均跟2次方有关的数组一个计算矩阵相乘的函数判断两个…

<Android开发> HAL层集成第三方so库

当我们需要在自己的代码中使用第三方提供的一些接口函数时&#xff0c;我们该如何加入&#xff1f;作者在写这比安文章前遇到了一个问题&#xff1a;需要在自己的HAL层中引用第三饭提供的算法库即so库&#xff1b;这个问题是作者第一次遇到&#xff0c;以往都是自己写一些代码编…

原宇宙之地产探索

前言 随着“元宇宙”的概念风靡全球&#xff0c;一股“炒房”之风也开始在元宇宙世界兴起&#xff0c;就连大家熟知的歌手林俊杰、Snoop Dogg也纷纷入局元宇宙。昂贵的元宇宙房价有些甚至高于北京的一套别墅价格。 元宇宙中的“炒房” 去年下半年&#xff0c;元宇宙房地产玩家竞…

Android Compose Bloom 项目实战 (二) : 欢迎页

1. 前言 上一篇文章我们讲到了Compose Bloom项目开发之前的一些配置及沉浸式状态栏的修改。 这篇文章接着上文&#xff0c;会介绍欢迎页的开发。 需要实现的页面效果如下所示 2. 分析页面组件 根据UI图&#xff0c;我们可以可知&#xff0c;该页面是由背景和前面部分部分组…

IDEA配置tomcat,快速部署tomcat

Tomcat简介 Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持&#xff0c;最新的Servlet 和JSP 规范总是能在Tomcat 中得…

地震数据处理研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Kubernetes集群coredns缓存容器bind: address already in use错误导致集群服务无法互通解决

coredns缓存nodelocal dns cache :53: bind: address already in use错误处理起因分析问题处理问题重启Node local dns起因 事情起因是Kubernetes集群内的服务无法互相访问了 分析问题 因为Kubernetes集群内的服务都是通过service、pod的名称作为域名到coredns解析Cluster I…