前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回溯法解决【电话号码的字母组合】问题

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

作者头像
掘金安东尼
发布2022-09-19 10:59:21
3100
发布2022-09-19 10:59:21
举报
文章被收录于专栏:掘金安东尼

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战


接月初算法系列,思路:

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

本篇将继续深入回溯法!

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

题目:

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

代码语言:javascript
复制
示例 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 实现:

代码语言:javascript
复制
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,以上就是本篇分享~ 撰文不易,点赞鼓励👍👍👍

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档