当前位置: 首页 > news >正文

Leetcode 17.电话号码的字母组合

目录

题目

方法一

思路

代码


题目

17. 电话号码的字母组合

难度:中等

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

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

示例 1:

输入:digits = "23"

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

示例 2:

输入:digits = ""

输出:[]

示例 3:

输入:digits = "2"

输出:["a","b","c"]

方法一

思路

这是一个经典的回溯问题,我们先来分析一下这道题的暴力解法。暴力解法很容易想到,通过给定的字符串的数字个数和每个数字对应的字母,我们使用循环遍历,然后存储下来加入返回数组,这是一个简单的穷举算法。

我们可以使用回溯算法优化,每个回溯算法都可以抽象为树形结构。

  • 根节点:代表算法的起始点,没有任何决策,相当于回溯树的顶部。

  • 分支:从每个节点延伸出的边表示可能的决策或选择。在选择一个选项后,算法沿着相应的分支向下移动到树的下一层。

  • 叶子节点:代表算法的最终状态,通常是找到了问题的解或者是达到了问题空间的边界。

  • 回溯边:当算法在某个分支上探索到尽头(即该路径不是解的一部分)时,它会通过回溯边返回到上一个决策点,尝试其他选项。

  • 深度优先搜索:回溯算法通常采用深度优先搜索(DFS)策略,即尽可能深地探索树的分支,直到找到解或确定该分支不包含解。

  • 剪枝:在某些情况下,可以提前判断某个分支不可能是解的一部分,从而剪掉这个分支,减少不必要的计算。

  • 路径:从根节点到叶子节点的路径代表一个完整的解决方案,或者在电话号码的字母组合问题中,代表一个完整的字母组合。

  • 状态存储:在树的每个节点上,都需要存储足够的状态信息,以便在回溯时能够恢复到之前的决策状态。

以本题为例,树的根节点没有字母,每个数字对应一层,每层的节点数等于该数字可以映射到的字母数。从每个节点延伸出的边代表选择一个特定的字母,叶子节点代表一个完整的字母组合。 

以字符串 "23" 为例,他对应的回溯树结构如下:

我们用递归模拟树的遍历,在遍历到每层结点时将其加入字符串。在递归到递归出口时就是遍历到叶子结点,此时就是完整组合。我们将其加入返回数组。

以为我们要的是全部组合,所以不需要剪枝。

在递归返回后我们会从字符串中弹出一个字符,对应的是回溯的过程。

代码

class Solution {
public:string s;vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};void dfs(int index,string& digits,vector<string>& ret){if(index == digits.size()){ret.push_back(s);return;}int z=digits[index]-'0';for(int i=0;i<board[z].size();i++){s.push_back(board[z][i]);//递归dfs(index+1,digits,ret);//回溯s.pop_back();}}vector<string> letterCombinations(string digits) {vector<string> ret;if(digits.empty()){return ret;}dfs(0,digits,ret);return ret;}
};

注意:在 letterCombinations 如果digits为空需要返回,不然在 dfs中会加入一个空串。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot自动装配原理
  • 探索 Go 语言的 json 库
  • 1Panel应用推荐:KubePi开源Kubernetes管理面板
  • 【运维项目经历|040】高可用Web服务平台:LVS+Apache集群+NFS共享存储系统
  • C 循环
  • GNU/Linux - memtool使用
  • 【YOLOV8】YOLOV8模型训练train及参数详解
  • 12322222222
  • 零基础5分钟上手亚马逊云科技AWS核心云架构知识-用S3桶托管静态网页
  • 2940 找到Alice和Bob可以相遇的建筑 (944/951)超时
  • Delphi 利用LiveBindings绑定JSON数据到列表控件
  • [CSS]一文掌握
  • 快速学会SpringBoot图形验证码生成:一步步教你打造安全验证
  • 参会记录|2024 中国多媒体大会
  • leetcode-vector
  • [译]Python中的类属性与实例属性的区别
  • CSS实用技巧
  • Docker下部署自己的LNMP工作环境
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Leetcode 27 Remove Element
  • nginx 负载服务器优化
  • Python连接Oracle
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • underscore源码剖析之整体架构
  • 翻译:Hystrix - How To Use
  • 搞机器学习要哪些技能
  • 理清楚Vue的结构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 软件开发学习的5大技巧,你知道吗?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • # 透过事物看本质的能力怎么培养?
  • # 职场生活之道:善于团结
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (补)B+树一些思想
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (九十四)函数和二维数组
  • (七)glDrawArry绘制
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)linux 命令大全
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **PHP分步表单提交思路(分页表单提交)
  • .bat文件调用java类的main方法
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net和jar包windows服务部署
  • .NET中winform传递参数至Url并获得返回值或文件
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?