电话号码的字母组合

力扣题目链接(opens new window)

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

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

示例:

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

说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序

思路

题目给的例子好像可以用for循环解决,但是输入一旦变多,就又碍于for循环的深度限制而无法解决了

所以还是得用回溯

本题与 组合问题 很像,我们要解决的问题如下:

  • 数字和字母之间如何映射?
  • 用回溯解决for循环深度不足的问题,从而遍历出所有组合结果
数字和字母如何映射

可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,这里定义一个二维数组,代码如下:

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

1、确定回溯函数的参数与返回值

首先需要一个字符串saveStr来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量依旧定义为全局变量

输入参数是题目给的digits,另外还需要一个参数index,用来指明当前遍历到了digits中的哪个数(index也表示树的深度)

class Solution {
//定义一个map用来映射数组与字母
private:
string letterMap[10] = {
...
};
//确定回溯函数的参数和返回值
vector<string> res;
string saveStr;//用于保存叶子结点出的字符串
void backtracking(string& digits, int index){//index是用来指明当前遍历到了digits中的哪个数
}
public:
vector<string> letterCombinations(string digits) {
}
};

2、确定终止条件

index等于输入数字个数就结束,相当于遍历完一遍digits

class Solution {
//定义一个map用来映射数组与字母
private:
string letterMap[10] = {
...
};
//确定回溯函数的参数和返回值
vector<string> res;
string saveStr;//用于保存叶子结点出的字符串
void backtracking(string& digits, int index){//index是用来指明当前遍历到了digits中的哪个数
//确定终止条件
if(index == digits.size()){//index等于输入数字个数就结束,即遍历完一遍digits
res.push_back(saveStr);
return;
}
}
public:
vector<string> letterCombinations(string digits) {
}
};

3、确定单层处理逻辑

首先要取index指向的数字,即从输入数字字符串取数字并转为整型

然后从映射表中取出对应数字的字母映射

class Solution {
//定义一个map用来映射数组与字母
private:
string letterMap[10] = {
"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
//确定回溯函数的参数和返回值
vector<string> res;
string saveStr;//用于保存叶子结点出的字符串
void backtracking(string& digits, int index){//index是用来指明当前遍历到了digits中的哪个数
//确定终止条件
if(index == digits.size()){//index等于输入数字个数就结束,即遍历完一遍digits
res.push_back(saveStr);
return;
}
//确定单层处理逻辑
//从输入数字字符串取数字并转为整型
int singleDigi = digits[index] - '0';
//从映射表中取出对应数字的字母映射
string digiMap = letterMap[singleDigi];
for(int i = 0; i < digiMap.size(); ++i){
saveStr.push_back(digiMap[i]);
backtracking(digits, index + 1);
saveStr.pop_back();//回溯处理
}
}
public:
vector<string> letterCombinations(string digits) {
}
};

注意这里for循环是从0开始遍历,因为手机按键是从0~9

代码

class Solution {
//定义一个map用来映射数组与字母
private:
string letterMap[10] = {
"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
//确定回溯函数的参数和返回值
vector<string> res;
string saveStr;//用于保存叶子结点出的字符串
void backtracking(string& digits, int index){//index是用来指明当前遍历到了digits中的哪个数
//确定终止条件
if(index == digits.size()){//index等于输入数字个数就结束,即遍历完一遍digits
res.push_back(saveStr);
return;
}
//确定单层处理逻辑
//从输入数字字符串取数字并转为整型
int singleDigi = digits[index] - '0';
//从映射表中取出对应数字的字母映射
string digiMap = letterMap[singleDigi];
for(int i = 0; i < digiMap.size(); ++i){
saveStr.push_back(digiMap[i]);
backtracking(digits, index + 1);
saveStr.pop_back();//回溯处理
}
}
public:
vector<string> letterCombinations(string digits) {
if(digits == "") return res;
backtracking(digits, 0);
return res;
}
};

注意点

1、数字字符串转为整型的操作

2、TBD

【LeetCode回溯算法#03】电话号码的字母组合(数字映射字母)的更多相关文章

  1. leetcode回溯算法--基础难度

    都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思路 一直 ...

  2. PHP算法之电话号码的字母组合

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

  3. Leetcode(17)-电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  4. 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题

    子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...

  5. LeetCode第十七题-电话号码的字母组合

    Letter Combinations of a Phone Number 问题简介: 给定包含2-9的数字的字符串,返回该数字可能表示的所有可能的字母组合. 下面给出了数字到字母的映射(就像在电话按 ...

  6. Leetcode题库——17.电话号码的字母组合

    @author: ZZQ @software: PyCharm @file: letterCombinations.py @time: 2018/10/18 18:33 要求:给定一个仅包含数字 2- ...

  7. 【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)

    复原IP地址 力扣题目链接(opens new window) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 ...

  8. 【LeetCode回溯算法#08】递增子序列,巩固回溯算法中的去重问题

    递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例 1: 输入:nums = [4,6,7,7] ...

  9. 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发饼干】

    火柴拼正方形 https://leetcode.cn/problems/matchsticks-to-square/ 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] ...

  10. 【LeetCode回溯算法#10】图解N皇后问题(即回溯算法在二维数组中的应用)

    N皇后 力扣题目链接(opens new window) n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇 ...

随机推荐

  1. Harbor 简要安装说明

    Harbor 简要安装说明 下载最新的离线安装文件 链接:https://pan.baidu.com/s/1ZEjgnI3YmhsdVOm7h7SWcQ 提取码:GSNB 复制这段内容后打开百度网盘手 ...

  2. Operating.System.Concepts.10th.Edition中文翻译

    <操作系统概念>是一本很好的书,主要介绍了操作系统的各个层面的概念,包含CPU调度,内存处理,文件系统等,目前已经出到第10版,是一本非常经典的书籍,从第1版至今被国内外众多高校选作教材, ...

  3. 【JS 逆向百例】如何跟栈调试?某 e 网通 AES 加密分析

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  4. HTML直接插入js、css

    简单的小页面可以使用 代码量大的话还是建议引用代码 直接包裹起来 <style>这里添加css代码</style> 加入css标识 <style type="t ...

  5. ChatGPT 中,G、P、T 分别是什么意思?

    流行的技术名词按发音难度排序,ChatGPT 肯定排在前面. 到底它为什么叫做 ChatGPT 呢? 先说 GPT:Generative Pre-Training Transformer Genera ...

  6. Unity2019使用Android Studio 4出安卓包

    前言 在我所经历的项目组中有这几种方法来生成APK 直接在Unity生成APK,可以接入SDK 使用Unity导出Android Studio工程手动生成APK 使用Unity导出Android St ...

  7. 关于git的几点疑问

    git rename后查看之前的记录 对于某个文件进行rename之后,使用show log命令查看之前的修改记录都会丢失,通过命令行方式进行mv之后,在tortoisegit中查看记录还是丢失的 g ...

  8. 小白学k8s(2)理解flannel网络

    理解flannel网络 简介 Kubernetes中的网络 flannel 总结 参考 理解flannel网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简 ...

  9. 5、后端学习规划:.Net学习 - 学习规划系列文章

    .Net是微软发布的一整套的软件编程解决方案.笔者从大学的时代开始就阅读.netframework的书籍了,但是当时没有进行实践.毕业后,笔者去了微软技术中心的公司上班,所以就接触了.net以及C#编 ...

  10. js转化文章发布于几天几小时几分钟前

    alert(dateFormat('2020-07-08 11:32:44')); function dateFormat(d1) { var dateEnd = new Date();//获取当前时 ...