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

算法:

数字到字母要映射,可以用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':把字符串转为intint 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,得到aes.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) {
//处理示例2if (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,不能直接addresult.add(path.toString());return;}//3.单层递归逻辑//str 表示当前index对应的字符串//比如index=2String 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代码中用到的语法知识:

//每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuildrStringBuilder 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.hqwc.cn/news/294351.html

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

相关文章

Vue基础知识一

一.Vue简介 1.1 Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既…

java String转asc码,然后ascII再转四位的16进制数。

理论知识补充&#xff1a; char是Java中的保留字&#xff0c;表示一种数据类型。与别的语言不同的是&#xff0c;char在Java中是16位的&#xff0c;因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中&#xff0c;其值对应十进制的表示范围是0~127。 char是Java八…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术&#xff0c;工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical&#xff0c;ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power&#xff0c;ULP)无线技术&…

git入门以及如何推送代码到云端

Gitee&#xff08;码云&#xff09;是开源中国于2013年推出的基于Git的代码托管平台、企业级研发效能平台&#xff0c;提供中国本土化的代码托管服务。 地址&#xff1a; Gitee - 基于 Git 的代码托管和研发协作平台 步骤1&#xff1a;创建远程仓库 在Gitee上创建一个新的远…

渲染控制之条件渲染

目录 1、使用规则 2、更新机制 3、使用if进行条件渲染 4、if ... else ...语句和子组件状态 5、嵌套if语句 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 1、使用规则 支持if、else和else if语句…

数据结构---算法的空间复杂度

文章目录 空间复杂度概念实例 空间复杂度 概念 空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。…

antdesignpro实现滚动加载分页数据

原理解析&#xff1a;每滚动一次相当于翻页&#xff0c;请求后端时给的页码参数要想办法加1&#xff0c;后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据&#xff0c;关键逻辑代码&#xff1a; # 根据前端传的页码&#xff0c;进行计算下一…

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者&#xff1a;索增增&#xff08;小红书&#xff09;、宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 背景介绍 Koordinator 是一个开源项目&#xff0c;基于阿里巴巴在容器调度领域多年累积的经验孵化诞生&#xff0c;目前已经支持了 K8s…

TSINGSEE青犀可视化视频云平台JT/T1078接入能力在智慧物流中的应用

一、引言 随着科技的快速发展和全球贸易的蓬勃发展&#xff0c;智慧物流成为了现代物流业的重要发展方向。智慧物流通过引入先进的信息技术&#xff0c;实现了物流过程的自动化、智能化和信息化&#xff0c;从而提高了物流效率和准确性。在这个过程中&#xff0c;JT/T1078接入…

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法 前面和大家介绍了通过在PLC中编程,结合HMI的图形IO域实现电机风扇或水泵旋转动画的具体方法,详细内容可参考以下链接: TIA博途Wincc中制作电机风扇或水泵旋转动画的具体方法示例 本次和大家分享通过VBS脚本实…

SpringBoot Elasticsearch全文搜索

文章目录 概念全文搜索相关技术Elasticsearch概念近实时索引类型文档分片(Shard)和副本(Replica) 下载启用SpringBoot整合引入依赖创建文档类创建资源库测试文件初始化数据创建控制器 问题参考 概念 全文搜索&#xff08;检索&#xff09;&#xff0c;工作原理&#xff1a;计算…

面对大促场景来临,如何从容进行性能测试

作者&#xff1a;赵佳佳 每年双十一、圣诞、春节大促的消费狂欢中&#xff0c;我们可以看到在高峰时段品牌直播间同时容纳着几百万人线上发弹幕、抢货、抢红包&#xff0c;在品牌店铺中又有着同样规模的咨询、加购、下单、支付等等。愈发庞大的用户体量、愈发高频的交互动作以…