使用kotlin用回溯法解决电话号码的字母组合问题

news/2024/11/8 6:44:36/

17. 电话号码的字母组合

难度中等

2474

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

通过次数696,168提交次数1,198,761

 题解:

我们先定义了一个字母表,将数字映射到对应的字母组合上。接着定义了一个结果集合result。在函数letterCombinations中,我们首先判断特殊情况,如果数字串为空,则返回空列表。否则,我们开始递归调用回溯函数backtrack

在回溯函数中,我们首先判断是否已经到达数字串的末尾,如果到达,则将当前的组合字符串加入结果集合中。否则,我们取出当前数字所对应的字母组合,对于每一个字母,都将其加入到组合字符串中,并递归调用backtrack函数,最后将该字母从组合字符串中删除(回溯到上一步)。

这样,当回溯函数返回时,我们就可以得到所有的字母组合了。

class Solution {private val letterMap = arrayOf("", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz")private val result = mutableListOf<String>()fun letterCombinations(digits: String): List<String> {if (digits.isEmpty()) {return emptyList()}backtrack(digits, 0, StringBuilder())return result}private fun backtrack(digits: String, index: Int, combination: StringBuilder) {if (index == digits.length) {result.add(combination.toString())return}val digit = digits[index].toString().toInt()val letters = letterMap[digit]for (i in letters.indices) {combination.append(letters[i])backtrack(digits, index + 1, combination)combination.deleteCharAt(combination.length - 1)}}
}

回溯法属于暴力求解,有趣的是,竟然做到了不重不漏,虽然是穷举,将符合情况的结果全部都收集起来。如果全部掌握了回溯法,那么数独这个游戏就变得毫无意义了。


http://www.ppmy.cn/news/97853.html

相关文章

HCIA-RSTP,MSTP

目录 STP的不足 RSTP对STP的改进 1&#xff0c;配置BPDU的处理发生变化&#xff1a; 2&#xff0c;配置BPDU的格式发生变化&#xff0c;充分利用STP的flag字段&#xff0c;明确接口角色。 3&#xff0c;RSTP拓扑处理&#xff1a; 端口角色&#xff1a; MSTP&#xff08;多…

spark sql(四)物理计划解析

1、流程解析 在该系列第二篇文章中介绍了spark sql整体的解析流程&#xff0c;我们知道整体的sql解析分为未解析的逻辑计划&#xff08;Unresolved LogicalPlan&#xff09;、解析后的逻辑计划&#xff08;LogicalPlan&#xff09;、优化后的逻辑计划&#xff08;Optimized Lo…

C++第七章:类

类 一、定义抽象数据类型1.1 定义抽象数据类型类的用户 1.2 定义一个书籍类引入this引入const成员函数类作用域和成员函数在类的外部定义成员函数定义一个返回this对象的函数 1.3 定义类相关的非成员函数定义read和print函数最终代码 1.4 构造函数合成的默认构造函数某些类不能…

【Python从入门到进阶】21、爬虫相关概念介绍

接上篇《20、HTML页面结构的介绍》 上一篇我们正式进入了Python爬虫的实战教程&#xff0c;主要讲解了要爬取的HTML页面的结构。本篇我们来介绍爬虫的相关概念。 一、什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个…

深入解析HTTP协议:打破你对网络传输的认知误区

HTTP协议&#xff08;HyperText Transfer Protocol&#xff09;是Web应用程序中最重要的基础协议之一。它利用TCP/IP作为底层协议&#xff0c;充当Web服务器和浏览器之间的媒介&#xff0c;使数据传输和互联网通信更加高效。学习HTTP协议对于任何计算机专业人士和Web开发者来说…

MyBatis-plus的批量插入方式对比分析

MyBatis-plus的批量插入方式对比分析 【摘要】Mybatis批量插入一直是开发者重点关注的问题&#xff0c;本文列举了Mybatis的五种插入方式进行对比分析&#xff0c;验证了五种批量插入的方式的优先级。 1 准备工作 1.1 新建spring项目 略。 1.2 导入pom.xml依赖 <depende…

docker+redis哨兵模式(一主二从三哨兵)- docker-compose

一、docker-compose 安装&#xff1a; sudo apt-get update #安装最新的docke-ce sudo apt-get install docker-ce # 下载最新的docker-compose curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-uname -s-uname -m -o /usr/local…

《Java 核心技术卷一:基础知识》读书笔记(二)

Java 的基本程序设计结构 一个简单的 Java 应用程序 下面看一个最简单的 Java 应用程序&#xff0c;它只发送一条消息到控制台窗口中&#xff1a;/** output We will not use Hello, World!*/ public class FirstSample {public static void main(String[] args) {System.out…