17_电话号码的字母组合

news/2024/9/19 23:33:31/文章来源:https://www.cnblogs.com/zeta186012/p/18401300

17_电话号码的字母组合

【问题描述】

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

img

示例一:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例二:
输入:digits = ""
输出:[]示例三:
输入:digits = "2"
输出:["a","b","c"]

提示:

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

【算法设计思想】

本题主要是用到了DFS,即深度优先搜索的思想。在此我们需要搞清楚DFS的基本思想和伪代码是怎么样的。

DFS的算法设计思想:一种用于遍历或搜索树或图的算法。DFS的基本思想是从根节点开始(选择某个搜索起始节点),先尽可能深的搜索树的分支,如果到底了(即到达一个叶子节点或者当前节点没有任何未访问的子节点),就回溯到上一层,继续尽可能深的搜索其它未搜索过的子节点,这个过程一直持续到所有的节点都被访问过为止。

伪代码如下:

procedure DFS(G,V):make V as visited;for each w in G.adjacent(v) do //遍历v的所有邻接顶点ifw is not visited thenDFS(G,w)//递归访问w

我们可以把这个问题看成是一个搜索的问题,在这里,2对应abc,3对应def,我们只需要求其组合就可以了,本质上是一个树形的结构,我们对这个树进行DFS即可得到答案,所以通过本题我们要复习DFS这个知识点。

【算法描述】

C++:

class Solution
{
public:// 存储结果的容器std::vector<std::string> ans;// 字符串映射数组,对应数字键上的字母std::string strs[10] = {",", "", "abc", "def", "ghi", "jkl","mno", "pqrs", "tuv", "wxyz"};// 主要的方法,用于获取电话号码的字母组合std::vector<std::string> letterCombinations(std::string digits){// 如果输入的数字字符串为空,则直接返回空的结果集if (digits.empty()){return ans;}// 从第一个数字开始深度优先搜索dfs(digits, 0, "");// 返回所有可能的组合return ans;}// 深度优先搜索 (DFS) 辅助方法void dfs(const std::string &digits, int idx, std::string combine){// 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合if (idx == digits.length()){// 将当前组合加入结果集中ans.push_back(combine);return;}// 获取当前数字对应的字母字符串const std::string &s = strs[digits[idx] - '0'];// 遍历当前数字对应的字母字符串for (size_t i = 0; i < s.length(); i++){// 将当前字母添加到组合字符串中combine.push_back(s[i]);// 递归地进行下一步搜索dfs(digits, idx + 1, combine);// 回溯:移除最后一个字符,以便尝试下一个字母combine.pop_back();}}
};

Java:

import java.util.ArrayList;
import java.util.List;class Solution {// 存储结果的容器private List<String> ans = new ArrayList<>();// 字符串映射数组,对应数字键上的字母private String[] strs = {",", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};// 主要的方法,用于获取电话号码的字母组合public List<String> letterCombinations(String digits) {// 如果输入的数字字符串为空,则直接返回空的结果集if (digits.isEmpty()) {return ans;}// 从第一个数字开始深度优先搜索dfs(digits, 0, "");// 返回所有可能的组合return ans;}// 深度优先搜索 (DFS) 辅助方法private void dfs(String digits, int idx, String combination) {// 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合if (idx == digits.length()) {// 将当前组合加入结果集中ans.add(combination);  // 修改为 add 而不是 appendreturn;}// 获取当前数字对应的字母字符串String s = strs[digits.charAt(idx) - '0'];  // 使用 charAt 获得字符而不是使用索引// 遍历当前数字对应的字母字符串for (int i = 0; i < s.length(); i++) {// 将当前字母添加到组合字符串中combination += s.charAt(i);  // 使用 += 添加字符// 递归地进行下一步搜索dfs(digits, idx + 1, combination);// 回溯:移除最后一个字符,以便尝试下一个字母combination = combination.substring(0, combination.length() - 1);  // 使用 substring 方法回溯}}
}

Python:

from typing import Listclass Solution:def letterCombinations(self, digits: str) -> List[str]:# 结果容器ans: List[str] = []# 字符串映射字典,对应数字键上的字母strs = {",": "","": "","2": "abc","3": "def","4": "ghi","5": "jkl","6": "mno","7": "pqrs","8": "tuv","9": "wxyz"}# 如果输入的数字字符串为空,则直接返回空的结果集if not digits:return ans# 深度优先搜索 (DFS) 辅助方法def dfs(digits: str, idx: int, combination: str):# 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合if idx == len(digits):ans.append(combination)return# 获取当前数字对应的字母字符串s = strs[digits[idx]]# 遍历当前数字对应的字母字符串for i in range(len(s)):# 将当前字母添加到组合字符串中combination += s[i]# 递归地进行下一步搜索dfs(digits, idx + 1, combination)# 回溯:移除最后一个字符,以便尝试下一个字母combination = combination[:-1]# 从第一个数字开始深度优先搜索dfs(digits, 0, "")# 返回所有可能的组合return ans

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

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

相关文章

读软件设计的要素03概念的组合

概念的组合1. 概念的组合 1.1. 概念不像程序那样,可以用较大的包含较小的1.1.1. 每个概念对用户来说都是平等的,软件或系统就是一组串联运行的概念组合1.2. 概念是通过操作来同步组合的1.2.1. 同步并不增加新的概念操作,但会限制已有的操作,从而消除一些独立概念可能会出现…

南沙信C++陈老师解一本通题: 1101:不定方程求解

​ 【题目描述】给定正整数a,b,c。求不定方程 ax+by=c关于未知数x和y的所有非负整数解组数。【输入】一行,包含三个正整数a,b,c 两个整数之间用单个空格隔开。每个数均不大于1000。【输出】一个整数,即不定方程的非负整数解组数。【输入样例】 2 3 18 【输出样例】 4 #in…

musl libc 与 glibc 在 .NET 应用程序中的兼容性

musl Linux 和 glibc 是两种不同的 C 标准库实现,它们在多个方面存在显著差异。历史和使用情况:glibc 是较早且广泛使用的 C 标准库实现,具有较长的开发历史和广泛的社区支持。它被大多数 Linux 发行版采用,特别是在桌面和服务器环境中。 musl 是一个相对较新的实现,旨在提…

JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析)

JDBCJDBC(Java DataBase Connectivty,Java数据库连接)API,是一种用于执行Sql语句的Java API,可以为关系型数据库提供统一的访问,其由一组Java编写的类和接口组成.JDBC驱动程序起初,SUN公司推出JDBC API希望能适用于所有数据库,但实际中是不可能实现的,各个厂商提供的数据库差异…

Redis 入门 - 安装最全讲解(Windows、Linux、Docker)

最全的Redis安装教程,本文介绍了Redis在Windows(官方建议、脚本、可执行文件方式)、Linux(apt包管理器、源码编译)及Docker下的安装过程,详细步骤包括命令执行、文件操作等。经过上一章节的介绍,相信大家对Redis已经有了大致的认知,今天主要给大家详细讲解Redis在Windo…

WPF在UserControl使用MVVM模式实现窗体移动,最大化,最小化,关闭

1、在WPF中,我们移动窗体,可以使用MouseDown或者MouseLeftButtonDown去触发DragMove方法 2、当我们使用UserControl的时候,它是没有DragMove方法的,这个时候怎么办 我们改为命令的形式,可以直接调出当前的窗体,或者将窗体当参数传入到ViewModel,也没问题 我写了 <i:I…

ATTCK红队评估(红日靶场2)CS篇

靶机介绍红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练习、视频教程、博客三位一体学习。本次红队环境主要Access Token利用、WMI利用、域漏洞利用SMB relay,EWS relay,PTT(PTC),MS14-068,GPP,SPN利用、黄金票据/白银票据/Sid History/MOF等攻防技术。关…

esp32笔记[18]-使用汇编在riscv架构的esp32c3点灯

使用esp-idf工具链编译汇编程序实现在riscv架构的esp32c3点灯. Compiling an assembly program using the esp-idf toolchain to blink an LED on the RISC-V based ESP32-C3.摘要 使用esp-idf工具链编译汇编程序实现在riscv架构的esp32c3点灯. Abstract Compiling an assembly…

一、编程语言简介与C++

编程语言是编程的工具 计算机系统是分层的编程语言是软件,也i是分层的

AI证件照,抠图、换背景、任意尺寸...有了这个神器,证件照通通自己搞定(本地化部署教程)

最近有个Github开源的AI证件照神器火了,以后再也不用专门跑一趟照相馆拍证件照了! 你随手一张日常生活照或自拍,上传到它那里,分分钟就能帮你换上。 蓝底、白底,抠掉杂乱的背景,生成各种尺寸规格的证件照。 这款名叫HivisionIDPhotos的开源工具,它不仅能帮你便捷地制作出免冠白…

软件工程导论作业 2:python实现论文查重

github项目地址这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标 通过Python开发个人项目,实现项目单元测试1.PSP表格PSP2.1 Personal Software P…