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

代码随想录 Q71电话号码的字母组合

思路:

1.数字和字母如何映射?

答:可以使用map或者定义一个二维数组来做映射。如:

//初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串"" String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

2.如何解决n个for循环的问题?

答:回溯法。例如输入“2,3”,抽象为树形结构,如下图所示。

图中可以看出遍历的深度就是输入集合的长度,而叶子节点就是想要收集的结果。

回溯三部曲:

1.确定回溯函数的参数:

(1)全局变量:需要一个字符串s收集叶子节点的结果,需要一个字符串数组result保存结果。

//设置全局列表存储最后的结果 List<String> list = new ArrayList<>();

(2)参数:题目给的字符串 String digits,初始化所有数字对应字符的numString,和int型的index(和之前组合中记录下一次遍历的起始位置的startIndex不同,index用于记录遍历到第几个数字了,用来遍历digits,同时index也表示树的深度)。

public void backTracking(String digits, String[] numString, int index)

2.确定终止条件:如果index == 输入数字的个数,就收集结果,结束本层递归。

//终止条件,如果到达最后一个元素则将当前的这个结果放入list结果集 if (index == digits.length()) { list.add(temp.toString()); return; }

3.确定单层搜索的过程:首先要取index指向的数字,并找到对应的字符集(收集键盘的字符集),然后用for循环来处理这个字符集。注意此处for不从index或者startIndex开始遍历,而是从1开始,这是因为本题中每一个数字代表的是不同的集合,相当于求不同集合之间的组合,而之前的组合问题相当于求同一个集合中的组合

//str表示当前index对应的字符串 String str = numString[digits.charAt(index) - '0']; for(int i = 0;i<str.length();i++){ temp.append(str.charAt(i)); //递归,处理下一层 backTracking(digits,numString,index + 1); //剔除末尾的继续尝试 temp.deleteCharAt(temp.length() - 1); }

附代码:

class Solution { List<String> list = new ArrayList<>(); //每次迭代都会获取一个字符串,涉及大量字符串的拼接,选择更高效的StringBuilder StringBuilder temp = new StringBuilder(); public List<String> letterCombinations(String digits) { if(digits == null || digits.length() == 0){ return list; } //初始化所有数字对应的字母,为了直接对应2-9,新增了两个无效的字符串“ ” String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; backTracking(digits,numString,0); return list; } private void backTracking(String digits,String[] numString,int index){ if(index == digits.length()){ //遍历完全部元素后,一次性记录得到的字符串 list.add(temp.toString()); return; } //str表示当前index对应的字符串 String str = numString[digits.charAt(index) - '0']; for(int i = 0;i<str.length();i++){ temp.append(str.charAt(i)); // 递归,处理下一层 backTracking(digits,numString,index + 1); // 剔除末尾的继续尝试 // deleteCharAt表示删掉指定位置的字符(不能deleteCharAt(str.charAt(i))) temp.deleteCharAt(temp.length() - 1); } } }
http://www.jsqmd.com/news/560650/

相关文章:

  • 2026年意大利里米尼健身展 RiminiWellness- 新天国际会展 - 中国组展单位 - 新天国际会展
  • 2026划线机厂家推荐:智能化转型下的5大优质选择 附选型指南 - 博客湾
  • REX-UniNLU实战:电商评论情感分析+实体抽取,5分钟生成结构化报告
  • 3分钟搞定歌词获取!163MusicLyrics免费开源工具终极指南
  • 如何彻底告别微信聊天记录丢失?WeChatMsg让你的对话永久留存
  • WeChatMsg:实现微信聊天记录永久备份的创新方案 - 个人用户的数据自主与隐私保护指南
  • 2026年3月商场拆除公司推荐:静音无损快速拆运 全流程安全合规之选 - 品牌企业推荐师(官方)
  • OPENIPC[ssc338Q+hi3536dv100]开源图传----硬件选型与实战避坑指南
  • Botty:暗黑2重制版自动化刷图的智能视觉方案——提升73%效率的开源工具
  • OpenClaw一周使用手记:一个老程序员的冷静观察
  • 手把手教你用Nunchaku FLUX.1:快速生成水彩质感插画作品
  • BERT文本分割模型API接口设计与性能测试
  • 融智天合同管理系统合同分类管理体验 - 业财科技
  • YOLOv12改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进
  • 一个好用的模块化和自动服务注册框架
  • 天津灵活用工服务怎么选?天津政集企业管理有限公司深耕天津东丽区天津滨海新区等地合规专业口碑好 - 十大品牌榜
  • 从公差锁死到标准化维保:解析GT Show现场RF RACER的系统级结项 - RF_RACER
  • CLIP-GmP-ViT-L-14在.NET生态中的集成:使用C#调用跨模态模型服务
  • 保姆级教程:用ROS的ipa_room_exploration包实现清洁机器人全覆盖路径(附源码解析)
  • 融智天合同管理系统合同台账体验 - 业财科技
  • Cufflinks完全指南:如何用Python轻松创建专业级金融图表
  • 如何为Cache贡献代码:开源项目参与指南
  • 深入解析原生HTTP与MCP服务器的交互机制
  • 一键生成古风角色:圣女司幼幽-造相Z-Turbo镜像使用入门
  • 5步解锁全速下载:开源工具彻底解决网盘限速难题
  • DVWA-Chinese从入门到精通:Web安全实践平台完全指南
  • 如何通过 Firecrawl MCP Server 与 Windsurf 集成提升 AI 代码助手的网页理解能力
  • 7步打造坚不可摧的团队安全文化:从意识培训到实践落地
  • Pixel Mind Decoder 效果对比评测:在不同文体和语言风格下的表现
  • Gephi进阶指南——外观定制与布局优化实战