1.题目链接:

17. 电话号码的字母组合

2.解题思路:

2.1.题目要求:

给定一个仅包含数字 2-9 的字符串 digits ,返回所有它能表示的字母组合。

数字和字母的关系:

例子:

输入:"23"

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

2.2.思路:

制作成n叉树,比如下图,输入"23",遍历完 2 的字母然后又遍历 3的字母。

2.3.回溯三部曲:

先用二维数组映射数字和字母的关系

const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9
};

2.3.1.确定回溯函数参数

首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个定义为全局变量,可以显的参数简洁一点。

函数的参数写题目传进来的数字字符串 digits ,以及int型的index(代表遍历的层数)

index用于终止条件,作用是统计数字数量,用于终止条件(下面解释)

vector<string> result;
string s;
void backtracking(const string& digits, int index)

2.3.2.确定终止条件

终止条件就是当 输入的数字个数(digits.size) 等于 index 遍历的层数后,把字符串 s 搜集到的结果,传入结果集 result。

if (index == digits.size()) {result.push_back(s);return;
}

2.3.3.确定单层遍历逻辑

先将 字符串digits 里的"数字"转成int类型的数字,因为题目给的数字实际上是字符串...需要先进行转化,

用这个数字取上面定义的数字和字母的映射,取出数字对应的字母集,用于for循环(for循环里在按顺序取出字母进行配对)

int digit = digits[index] - '0';        // 将index指向的数字转为int
string letters = letterMap[digit];      // 取数字对应的字符集

后面就是for循环了,遍历的结果输入储存字符串 s 里面,用于在终止条件触发的时候,输入结果集,同时记得要回溯。

for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            // 处理backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了s.pop_back();                       // 回溯
}

组合一下:

int digit = digits[index] - '0';        // 将index指向的数字转为int
string letters = letterMap[digit];      // 取数字对应的字符集
for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            // 处理backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了s.pop_back();                       // 回溯
}

2.4.总代码:

// 版本一
class Solution {
private:const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};
public:vector<string> result;string s;void backtracking(const string& digits, int index) {if (index == digits.size()) {result.push_back(s);return;}int digit = digits[index] - '0';        // 将index指向的数字转为intstring letters = letterMap[digit];      // 取数字对应的字符集for (int i = 0; i < letters.size(); i++) {s.push_back(letters[i]);            // 处理backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了s.pop_back();                       // 回溯}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if (digits.size() == 0) {return result;}backtracking(digits, 0);return result;}
};

3.疑问

字符串类型减个字符型的 '0' 就变成int类型的了??

 int digit = digits[index] - '0';

C++中用数字表示的字符减去字符 '0'的含义是讲该char类型的字符转换为对应的int类型,

例如;

  1. char S = '5';

  2. int X = S - '0';

  3. cout << X << endl;

X的输出结果是:

x:5

index初始值干嘛要取个0?他是干嘛的??

好像他是层数,用于在终止条件上作比较的,加入数字数量是2,初始是0层,递归一次=1,第二次变成=2,这个时候要进行第三次了。在第三次的递归里碰上终止条件,然后返回,嗯,刚好也可以。

4.记录:

无,待会写下代码,

太晚了,没梳理完,代码也只是过,不过进度要紧。也没有那么多完美的事,尽力完善就好

003. 电话号码的字母组合——回溯算法相关推荐

  1. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  2. 数字拆分问题算法回溯_回溯算法:求子集问题!

    给「代码随想录」一个星标吧! ❝ 认识本质之后,这就是一道模板题 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/le ...

  3. 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...

    给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...

  4. Leetcode回溯算法经典题目总结

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 "回溯" 返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索 ...

  5. 回溯算法与深度优先算法

    搜索与回溯是计算机竞赛中常用的算法,当很多问题无法通过计算法则来求解时,便可以利用搜索和回溯的技术来求解. 回溯是搜索算法中的一种控制策略,它的基本思想是:为了求得问题的解,先选择一种可能的情况向前探 ...

  6. 回溯算法之电话号码的字母组合

    解法框架 [README]回溯算法基本框架 电话号码的组合(点击跳转) 对于这道题,很明显涉及到的也是回溯算法.但是这道题有一特别之处,就是它的选择列表给的不明显,回想全排列那道题目,其选择列表给出的 ...

  7. leetcode 回溯算法 17. 电话号码的字母组合

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

  8. 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)

    目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...

  9. LeetCode算法题17:电话号码的字母组合(Java版)

    LeetCode传送门:电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: ...

最新文章

  1. 【组队学习】【29期】Datawhale组队学习内容介绍
  2. 基于SSM实现租房平台管理系统
  3. Asp.net几大内置对象
  4. Linux装c编译器gcc,c编译器进阶之路,linux下的gcc c编译器使用教程
  5. C++中相对路径与绝对路径以及斜杠与反斜杠的区别 及 处理代码
  6. 关于java中next,nextInt,nextLine的区别
  7. 读书笔记Black-Scholes-Merton之二
  8. 转载:[Matlab]结构体(Struct)
  9. Bailian2790 迷宫【DFS】
  10. Unity3D基础42:AnyState大法
  11. (转)60s快速分析Linux性能
  12. 商汤连发11款新品,把自己逼上“AI落地”极限
  13. 破解大众点评字体反爬
  14. 五菱“神车”再添一员,小型电动车迎来“均值回归”?
  15. Go技术日报(2021-11-16/17)——gRPC的错误处理实践
  16. 概率统计(probability statistics)
  17. redis安装(保姆级别)
  18. 摩杜云将出席CDEC2021中国数字智能生态大会
  19. 大话设计模式读书笔记之状态模式
  20. 每天自动发英文外链 247backlinks

热门文章

  1. js提示“未结束的字符串常量”
  2. 腾讯游戏天美工作室实习感悟
  3. 学习笔记 吴恩达 斯坦福大学公开课 :机器学习课程-1 机器学习的动机与应用
  4. 实战day01(二)----电商行业的背景介绍
  5. Elasticsearch查询时还在百度DSL语句吗?你可能需要这份总结
  6. 超通俗易懂科普:什么是光通信?
  7. Odoo----异常、错误、警告、提示、确认信息显示
  8. sqldeveloper的安装及其使用教程
  9. 房贷计算器html代码,html房贷计算器输出两个框怎么弄
  10. 试戴耳钉会感染艾滋病吗?