回溯法解决【电话号码的字母组合】问题

简介: 接月初算法系列,思路:滑动窗口 => BFS、DFS => 回溯法,各个经典!

image.png

接月初算法系列,思路:


滑动窗口 => BFS、DFS => 回溯法,各个经典!


本篇将继续深入回溯法!


经典题目之:电话号码的字母组合


题目:

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

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

image.png


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


解题思路:

  1. 用map保存数字对应的字母
  2. 从第一个数字开始遍历,取一个字母,然后从第二个数字,取一个字母,第三个数字,取一个字母...
  3. 数字遍历完了,将拼接好的字符串str加入结果数组res
  4. 回溯,修改最后一个数字对应的字母
  5. 重复2-4过程


JS 实现:

var letterCombinations = function (digits) {
  // 为空特殊处理
  if (digits.length === 0) return [];
  let numMap = new Map([
    ['0', ''],
    ['1', ''],
    ['2', 'abc'],
    ['3', 'def'],
    ['4', 'ghi'],
    ['5', 'jkl'],
    ['6', 'mno'],
    ['7', 'pqrs'],
    ['8', 'tuv'],
    ['9', 'wxyz']
  ])
  let res = [];
  dfs("", digits);
  return res;
  function dfs(str, digit) {
    // 如果字符串为空了,将拼接好的字符加入数组
    if (digit.length === 0) res.push(str);
    else {
      // 拿到字符串第一个字符,拿到其对应的数字
      let numstr = numMap.get(digit[0]);
      // 对可能性进行组合
      for (let i = 0; i < numstr.length; i++) {
        str += numstr[i];
        // 递归组好的 str和下一段字符串
        dfs(str, digit.slice(1))
        // 回溯
        str = str.slice(0, -1);
      }
    }
  }
};


小结:回溯本质是暴力搜索,在问题的解空间树中,用 DFS 的方式,从根节点出发搜索整个解空间。 如果要找出所有的解,则要搜索整个子树,如果只用找出一个解,则搜到一个解就可以结束搜索。


“找出所有可能的组合”的问题,适合用回溯算法。


OK,以上就是本篇分享~ 撰文不易,点赞鼓励👍👍👍

我是掘金安东尼,公众号同名,日拱一卒、日掘一金,再会~


相关文章
|
3月前
|
SQL 人工智能 算法
大厂校招变了:AI 能力正在进入笔试和面试
今年校招AI能力成硬通货:技术岗考AI辅助工程(拆需求、识错误、融流程),非技术岗考AI驱动业务(方案判断、活动闭环、流程优化)。关键不在“会不会用”,而在“能否带判断力将AI深度融入工作流并交付高质量结果”。
|
XML Java 数据库
探索 Spring Boot 中的 @Configuration 注解:核心概念与应用
【4月更文挑战第20天】在 Spring Boot 项目中,@Configuration 注解扮演了一个关键角色,它标识一个类作为配置源,这些配置用于定义和管理 Spring 应用程序中的 Bean
3109 7
|
设计模式 前端开发 安全
理解最常用的MVC分层模型及其变种
【6月更文挑战第24天】 本文介绍架构模式如MVC、MVVM和MVP是解决软件结构问题的通用方案。。每种模式有其优缺点,适用场景不同。
1240 0
理解最常用的MVC分层模型及其变种
|
JavaScript
成功解决node、node-sass和sass-loader版本冲突问题、不需要降低node版本。如何在vue项目中安装node-sass,以及安装node-sass可能遇到的版本冲突问题
这篇文章介绍了在Vue项目中安装node-sass和sass-loader时遇到的版本冲突问题,并提供了解决这些问题的方法,包括在不降低node版本的情况下成功安装node-sass。
成功解决node、node-sass和sass-loader版本冲突问题、不需要降低node版本。如何在vue项目中安装node-sass,以及安装node-sass可能遇到的版本冲突问题
|
编解码 API 开发工具
程序与技术分享:AAC音频格式详解
程序与技术分享:AAC音频格式详解
|
消息中间件 网络协议 Linux
用docker方式 安装rabbitmq 并配置MQTT
用docker方式 安装rabbitmq 并配置MQTT
1194 0
|
JSON Java fastjson
JSON与Java的两种解析方式
JSON与Java的两种解析方式
|
测试技术 C++ 异构计算
Falcon 180B 目前最强大的开源模型
Technology Innovation Institute最近发布了Falcon 180B大型语言模型(LLM),它击败了Llama-2 70b,与谷歌Bard的基础模型PaLM-2 Large不相上下。
579 0
|
网络协议 数据中心 网络架构
华为网络配置(BGP)
BGP概述、BGP介绍、BGP的起源、BGP作用、BGP的特点、BGP的分类和区别、BGP报文交互中的角色、BGP的路由器号(Router ID)、BGP的报文、BGP状态机、BGP对等体之间的交互原则、BGP的路由属性、常见的BGP路由属性、BGP的选路规则、路由环路、BGP配置、案例、配置过程、测试
907 0
 华为网络配置(BGP)
|
算法 安全 编译器
MD5 消息摘要算法
MD5 算法是 MD4 消息摘要算法的扩展。MD5 比 MD4 稍慢,但在设计上更“保守”。MD5 的设计是因为人们认为 MD4 的使用速度可能比现有的批判性审查所证明的要快;由于 MD4 的设计速度非常快,因此就成功进行密码分析攻击的风险而言,它处于“边缘”。MD5 稍有后退,稍微降低速度以获得更大的最终安全性。它包含了不同评论者提出的一些建议,并包含额外的优化。MD5 算法正被置于公共领域以供审查并可能作为标准采用。
720 0
MD5 消息摘要算法

热门文章

最新文章