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

17. 电话号码的字母组合

这题是经典的回溯(Backtracking)入门题。

核心思想:

  • 每个数字都对应几个字母

  • 我们要从每一位数字里“选一个字母”

  • 一直选到最后,就得到一个完整组合

比如:

"23" 2 -> abc 3 -> def

其实就是:

a + d a + e a + f b + d ...

本质上是一棵树:

"" / | \ a b c / | \ ... d e f

回溯模板思路

回溯三件套:

1. 路径 path 2. 选择列表 3. 结束条件

这里:

path = 当前拼出的字符串 选择列表 = 当前数字对应的字母 结束条件 = path长度 == digits长度

标准解法(推荐背下来)

class Solution { List<String> res = new ArrayList<>(); String[] map = { "", // 0 "", // 1 "abc", // 2 "def", // 3 "ghi", // 4 "jkl", // 5 "mno", // 6 "pqrs", // 7 "tuv", // 8 "wxyz" // 9 }; public List<String> letterCombinations(String digits) { if (digits == null || digits.length() == 0) { return res; } backtrack(digits, 0, new StringBuilder()); return res; } public void backtrack(String digits, int index, StringBuilder path) { // 结束条件 if (index == digits.length()) { res.add(path.toString()); return; } // 当前数字 char digit = digits.charAt(index); // 转成 int String letters = map[digit - '0']; // 遍历当前数字对应字母 for (char c : letters.toCharArray()) { // 做选择 path.append(c); // 递归下一层 backtrack(digits, index + 1, path); // 撤销选择 path.deleteCharAt(path.length() - 1); } } }

一步一步理解执行过程

以:

digits = "23"

开始:


第一层:

index = 0 letters = abc

选择:

a b c

假设先选:

a

进入第二层:

index = 1 letters = def

继续选:

d e f

得到:

ad ae af

然后回退。

再选:

b

得到:

bd be bf

为什么需要“撤销选择”?

这是回溯最核心的地方。

比如:

path.append(c);

加入了:

a

递归结束后,必须删掉:

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

否则下一轮会变成:

ad -> ade

路径会污染。


时间复杂度

每个数字最多 4 个字母。

假设长度是 n:

时间复杂度:O(4^n)

因为本质是枚举所有组合。


这题真正训练的东西

这题非常重要,因为它是:

回溯树模型的起点

以后这些题本质都一样:

  • 全排列

  • 子集

  • 组合

  • N皇后

  • 括号生成

  • 单词搜索

你会发现:

做选择 递归 撤销选择

永远都是这一套。


这题你如果已经理解了,我下一题建议你直接做:

  • 22 括号生成

  • 46 全排列

因为它们会让你真正掌握回溯树。

http://www.jsqmd.com/news/842246/

相关文章:

  • 2026成都文件档案销毁服务优质机构推荐指南:成都专业销毁中心/成都产品销毁公司/成都文件销毁公司/成都销毁处理公司/选择指南 - 优质品牌商家
  • Token工厂:无锡部署昇腾384超节点算力集群,制造Token
  • STM32CubeMX 实战指南:LL库定时器中断与PWM输出综合应用
  • 2026年比较好的阳极氧化金属铝牌公司哪家好 - 品牌宣传支持者
  • 别再只用LogLoss了!手把手教你为XGBoost换上Focal Loss,搞定样本不平衡难题
  • 告别漫长等待:优化CMake配置,加速你的OpenSceneGraph 3.6.5编译过程
  • 智能工程机械平台:用数字化重塑工程机械行业管理新生态
  • Arm Compiler 6.16LTS功能安全认证语言扩展解析
  • AI大模型大数据隐私安全解决方案
  • 一次奇怪的抓包现象:为什么tcpdump看到的数据,和DPDK程序处理的数据不一样?
  • 暗物质暗能量本质,分享给各位玩家
  • React Server Components:重新定义服务端渲染
  • 结构可靠性与重要性在涡轮轴疲劳寿命可靠性设计中的应用【附算法】
  • 2026高压断路器特性测试仪行业优质推荐榜:高压开关机械特性测试仪检定装置、高压开关测试仪检定装置、高压开关特性测试仪检定装置选择指南 - 优质品牌商家
  • 告别Python依赖:用LabVIEW + TensorRT部署YOLOv8模型的完整避坑手册
  • React Suspense:优雅处理异步加载
  • 探索Logisim-evolution:解锁数字电路设计的无限可能
  • NotebookLM+学术期刊投稿(独家内测名单曝光:3本尚未公开但已接受LM生成文献综述的Q1期刊)
  • Android项目集成CH340串口驱动:从官方Demo到体温检测模块的完整配置流程
  • Windows终极优化神器:WinUtil一键搞定系统设置与软件安装
  • 基于 YOLOv8 的猫狗图像分类项目全流程复盘
  • 量子动态电路中的非破坏性状态快照技术解析
  • UE5动画拖尾粒子实战:用材质和通知轨道,5分钟给角色动作加上酷炫特效
  • 智慧隧道场景识别 隧道渗漏识别 隧道裂缝 隧道脱落 地铁隧道渗漏、地铁裂缝、地铁墙壁剥落 图像分类和目标检测数据集 (1)
  • ‌历史病毒扫描:清除拿破仑信件中的数字瘟疫‌
  • 2026年全球网络安全面临的挑战有那些?
  • React Transition:优化用户体验的秘密武器
  • RK3588平台LVGL 8.2移植实战:从FrameBuffer到DRM驱动优化
  • 2026装企ERP管理系统厂家选型:装企管理系统/装企管理软件/装修公司erp管理系统/装修公司erp管理软件/选择指南 - 优质品牌商家
  • 为什么BGA焊点总在四个角先坏?一次热-振耦合仿真给你讲明白