7.3电话号码的字母组合(LC17-M)

news2025/4/4 4:08:45

算法:

数字到字母要映射,可以用map,也可以用二维数组,或者直接用一个字符串

这里用字符串,键入的数字对应字符串的索引

String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

为什么要用回溯?

如果键入n个数字,那难道要用n个for循环吗?

可以用回溯。递归来求取组合。

回溯就要画树:

遍历的深度,就是输入"23"的长度(2),

宽度就是每个数字对应的字母个数(3),

叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。

回溯三部曲:

1.确定返回值和参数:

返回值:void

参数:digits(力扣题目里面给的)、Index(确定当前递归遍历到哪里一个数字了)、numString(用于传入字符串)

前两道题目是在一个集合中求组合,需要告诉我们当前已经收获了哪些组会,避免得到重复的组合,才要startindex。而本题在两个集合中(示例中为 2 3)作组合,所以不用startindex。

2.确定终止条件:

index== digits.size()

同时,收获结果

3.单层递归逻辑:

首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。

然后for循环来处理这个字符集,代码如下:

// 将index指向的数字转为int
//digits[index]:确定取的是电话里的哪个数字
//digits[index] - '0':把字符串转为int

int digit = digits[index] - '0';        
string letters = letterMap[digit];      // 取数字对应的字符集
//for循环:i从0开始取,比如abc,从a开始取,然后b c
for (int i = 0; i < letters.size(); i++) {
// 处理,把a Push进来
    s.push_back(letters[i]);      
// 递归
//注意index+1,下一层要处理下一个数字了
//(比如当前index处理的是2对应的字母abc,下一层就要处理3对应的字母def)      
    backtracking(digits, index + 1);
// 回溯  
//  比如在a下面取了d,得到ad,要把d pop掉,再取e,得到ae
    s.pop_back();                      
}

调试过程:

原因:

 `String` 和 `StringBuilder` 类型中找不到 `size()` 和 `add()` 方法。

对于 Java 字符串,应该使用 `length()` 方法来获取字符串的长度,而不是 `size()。

对于 `StringBuilder`如果要添加字符串,你应该使用 `append()` 方法,而不是 `add()`。

修改后:

原因:

在 `backtracking` 方法中,尝试将 `numString[i]` 的字符附加到 `path` 中,但是应该附加 `str.charAt(i)` 而不是 `numString[i]`

因为 `str` 包含了当前数字对应的字符串,而不是 `numString` 数组。

这意味着需要将 `path.append(numString[i])` 更改为 `path.append(str.charAt(i))`。这样才能将当前数字对应的字符逐个附加到 `path` 中。

修改后:

原因:问题出在if (digits == "" || digits == null ) return result;

应该改为

 if (digits == null || digits.length() == 0) return result;

或者

if (digits.equals("") || digits == null ) return result;

在 Java 中,使用 `==` 来比较两个字符串是否相等会检查它们是否是同一个对象,而不是检查它们的内容是否相等。因此,当使用 `==` 来比较 `digits` 是否为空字符串时,它实际上检查的是对象的引用是否为相同的对象。

对于字符串内容的比较,应该使用 `equals()` 方法。所以在你代码中,应该使用 `if (digits.equals("") || digits == null)` 来检查字符串是否为空或为 null。

因此,当你使用 `if (digits == "" || digits == null ) return result;` 时,如果 `digits` 是空字符串,条件 `digits == ""` 不会成立,因为它们不是同一个对象。这就是为什么 `result` 不会是空的原因。

正确代码:

class Solution {
    //全局变量List存储结果,path存储当前字符串组合
    List<String> result = new LinkedList<>();
    StringBuilder path = new StringBuilder();
    public List<String> letterCombinations(String digits) {
//处理示例2
    if (digits.equals("") || digits == null ) return result;
    String[] telephone = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv","wxyz"};
    backtracking (digits, 0, telephone);
    return result;

    }
    //回溯函数(递归函数)
    //1.确定返回值和参数
    void backtracking (String digits, int index, String[] numString){
    //2.确定终止条件
    if (index == digits.length()){
        //result是list,path是string,不能直接add
        result.add(path.toString());
        return;
    }
    //3.单层递归逻辑
    //str 表示当前index对应的字符串
    //比如index=2
    String str = numString[digits.charAt(index) - '0'];//str='abc'
    for (int i=0; i<str.length(); i++){

        path.append(str.charAt(i));//i=0,path='a'

        backtracking(digits, index+1, numString);

        path.deleteCharAt(path.length()-1);
    }
    }
}

 Java代码中用到的语法知识:

//每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuildr
    StringBuilder temp = new StringBuilder();

使用了 `StringBuilder` 类来构建字符串。相比于直接对字符串进行拼接操作,使用 `StringBuilder` 可以更高效地进行大量字符串操作,因为字符串是不可变的,每次对字符串进行拼接实际上是创建了新的字符串对象。而 `StringBuilder` 可以就地修改字符串而不创建新的对象,因此在大量字符串操作时,使用 `StringBuilder` 会更加高效。

 //遍历全部一次记录一次得到的字符串
        if (num == digits.length()) {
            list.add(temp.toString());
            return;
        }

`toString` 是 Java 中用于将对象转换为字符串的方法。在这个上下文中,`temp.toString()` 将 `temp` 对象转换为字符串形式,以便将其添加到 `list` 中。

String str = numString[digits.charAt(num) - '0'];

`charAt` 方法是 Java 中用于获取字符串中指定索引处的字符的方法。在给定的上下文中,`str.charAt(i)` 会从字符串 `str` 中检索索引为 `i` 处的字符。然后将这个字符追加到 `temp` 字符串中。

//剔除末尾的继续尝试
 temp.deleteCharAt(temp.length() - 1);

`deleteCharAt` 是 Java 中用于删除字符串中指定位置字符的方法。在这个上下文中,`temp.deleteCharAt(temp.length() - 1)` 会删除 `temp` 字符串中的最后一个字符。

时间空间复杂度:

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

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

相关文章

前端开发有了 Next.js,还需要后端开发吗 ?

前言 在迅速变化的Web开发领域&#xff0c;选择正确的工具和框架对于打造优秀的用户体验至关重要。Next.js&#xff0c;作为React框架的佼佼者&#xff0c;因其前后端流畅集成而受到广泛欢迎。这就引出了一个有趣的问题&#xff1a;我们真的需要Next.js的后端功能吗&#xff1f…

ESP32+LVGL笔记(6)-把712k的一二级汉字字库放在SPIRAM

文章目录 1.字库制作2.字库烧录到ESP32-S3的flash2.1 配置好分区文件2.2 汉字库文件烧录到ESP32的flash 3.将字库从 flash 拷贝到 SPIRAM3.1 工程配置中有关 SPIRAM 部分3.2 将汉字库从flash拷贝到SPIRAM的代码3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM 在前面…

部署LNMP动态网站

部署LNMP动态网站 安装LNMP平台相关软件1. 安装软件包2. 启动服务&#xff08;nginx、mariadb、php-fpm&#xff09;3. 修改Nginx配置文件&#xff0c;实现动静分离4. 配置数据库 上线wordpress代码 &#xff08;测试搭建的LNMP环境是否可以使用&#xff09;1. 上线php动态网站…

【机器学习】模式识别

1 概述 模式识别&#xff0c;简单来讲&#xff0c;就是分类问题。 模式识别应用&#xff1a;医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类&#xff1a;线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练&#xff08;学习&#xff09;过…

Spring中的上下文工具你写的可能有bug

文章目录 前言功能第一种&#xff1a;ApplicationContext第二种方式&#xff1a;ApplicationContextAware第三种&#xff1a;BeanFactoryPostProcessor 源码第一种第二种第三种 前言 本篇是针对如何写一个比较好的spring工具的一个探讨。 功能 下面三种方式&#xff0c;你觉…

Kubernetes api-server源码阅读2(Debug Kubernetes篇)

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes api-server源码阅读 系列第二篇&#xff0c;主要讲述如何实现 kubernetes api-server 的 debug 参考b站视频地址&#xff1a;Kubernetes源码开发之旅二 1.本篇章任务 Go-Delve&#xff1a;go语言的…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 &#xff08;一&#xff09;” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

指针:传址调用

#include <stdio.h> void Swap1(int x, int y) {int tmp x;x y;y tmp; } int main() {int a 0;int b 0;scanf("%d %d", &a, &b);printf("交换前&#xff1a;a%d b%d\n", a, b);Swap1(a, b);printf("交换后&#xff1a;a%d b%d\n&…

dotnet 的跨平台 UI 框架:WPF 的精神继承 | 开源日报 No.123

AvaloniaUI/Avalonia Stars: 20.7k License: MIT Avalonia 是 dotnet 的跨平台 UI 框架&#xff0c;提供灵活的样式系统&#xff0c;并支持 Windows、macOS、Linux、iOS、Android 和 WebAssembly 等多种平台。它被许多人认为是 WPF 的精神继承者&#xff0c;为 XAML 开发人员创…

OpenHarmony南向之Audio

音频架构 Audio驱动框架基于HDF驱动框架实现&#xff0c;包含内核态&#xff08;KHDF&#xff09;&#xff0c;和用户态&#xff08;UHDF&#xff09;&#xff0c; 对北向提供音频HDI接口 音频框架图 驱动架构主要由以下几部分组成。 HDI adapter&#xff1a;实现Audio HAL层…

java流浪动物保护系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 流浪动物保护系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

Spring Boot实践指南

一.SpringBoot入门案例 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringMVC程序过程 在没有SpringBoot前&#xff1a; 1.入门案例开发步骤 &#xff08;1&#xff09;创建新模块&#xff0c;选…

免费更新UltraNews v2.8.0 已注册 – Laravel报纸,博客多语言系统,支持AI作家,内容生成器脚本

UltraNews v2.8.0 已注册 – Laravel报纸&#xff0c;博客多语言系统&#xff0c;支持AI作家&#xff0c;内容生成器脚本 一、概述 在网络内容创作与管理领域&#xff0c;UltraNews v2.8.0以其高度现代化和多功能性而独树一帜。这是一个基于Laravel框架构建的报纸、博客多语言…

计算机网络概述(上)——“计算机网络”

各位CSDN的uu们好呀&#xff0c;好久没有更新小雅兰的计算机网络的专栏啦&#xff0c;而且期末考试也要考计算机网络&#xff0c;所以&#xff0c;小雅兰就来写计算机网络的内容啦&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入计算机网络概述的世界吧&#…

智能优化算法应用:基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蛇优化算法4.实验参数设定5.算法结果6.参考文…

基于python的excel检查和读写软件

软件版本&#xff1a;python3.6 窗口和界面gui代码&#xff1a; class mygui:def _init_(self):passdef run(self):root Tkinter.Tk()root.title(ExcelRun)max_w, max_h root.maxsize()root.geometry(f500x500{int((max_w - 500) / 2)}{int((max_h - 300) / 2)}) # 居中显示…

C语言易错知识点九(指针(part three))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;本大忙人已经很久没有更新博客了&#xff0c;我想大概我的粉丝们早…

使用ArcMap对工厂选址

文章目录 题目流程1&#xff0c;添加河流数据和高程数据2&#xff0c;对河流数据进行选取3&#xff0c;对高程数据进行选取并划定工厂选址范围3&#xff0c;根据工厂选址要求&#xff0c;获得整体的数据 结果 题目 实验名称&#xff1a;工厂选址 实验目的及要求&#xff1a; 根…

BATDK | 社招一年收割大厂算法offer

面试锦囊之面经分享系列&#xff0c;持续更新中 欢迎后台回复『面试』加入讨论组交流噢 没凑齐battmd是因为头条没面&#xff0c;美团面挂了。4/5的胜率&#xff1b;标题党了&#xff0c;T其实面的是搜狗&#xff0c;但是被腾讯收购&#xff0c;入职流程也走了腾讯的&#xf…