【LeetCode回溯算法#03】电话号码的字母组合(数字映射字母)
电话号码的字母组合
给定一个仅包含数字 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】电话号码的字母组合(数字映射字母)的更多相关文章
- leetcode回溯算法--基础难度
都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思路 一直 ...
- PHP算法之电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[" ...
- Leetcode(17)-电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...
- 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题
子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...
- LeetCode第十七题-电话号码的字母组合
Letter Combinations of a Phone Number 问题简介: 给定包含2-9的数字的字符串,返回该数字可能表示的所有可能的字母组合. 下面给出了数字到字母的映射(就像在电话按 ...
- Leetcode题库——17.电话号码的字母组合
@author: ZZQ @software: PyCharm @file: letterCombinations.py @time: 2018/10/18 18:33 要求:给定一个仅包含数字 2- ...
- 【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)
复原IP地址 力扣题目链接(opens new window) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 ...
- 【LeetCode回溯算法#08】递增子序列,巩固回溯算法中的去重问题
递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例 1: 输入:nums = [4,6,7,7] ...
- 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发饼干】
火柴拼正方形 https://leetcode.cn/problems/matchsticks-to-square/ 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] ...
- 【LeetCode回溯算法#10】图解N皇后问题(即回溯算法在二维数组中的应用)
N皇后 力扣题目链接(opens new window) n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇 ...
随机推荐
- Windows 修改时间提示: 某些设置已隐藏或由你的组织管理 的解决方案
最近公司的一台生产服务器时间不对. 因为机器有域控的需求, 所以加入了域, 想改时间时有这样的提示信息: 某些设置已隐藏或由你的组织管理 百度了很久发现没有解决方法.. 但是突然发现可以使用 运行-& ...
- [转帖]浅谈Redis大Key与热Key
https://www.cnblogs.com/jelly12345/p/16424080.html 如何定义大 Key 和 热 Key 如何定义大 Key 如何定义热 Key 大 Key 和 热 K ...
- Jumper Server 堡垒机搭建过程
Jumper Server 堡垒机搭建过程 背景说明 公司组织考核, 要对一套系统进行安全设置.有一个项目是使用堡垒机进行登录 堡垒机有多种用途,可以实现日志审计和安全设置等. 买商业设备的话太困难了 ...
- 浅析RobotFramework工具的使用 | 京东物流技术团队
1 简介 最近几年越来越多的公司都开始进行自动化测试的设计和布局了,自动化,顾名思义就是把以人为驱动的测试行为转化为机器执行的一种过程,并经常用于回归测试中,市面上也存在很多开源的自动化测试的工具和理 ...
- 字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 字节码编程插桩这种技术常与 Javaagent 技术结合用在系统的非入侵监控中,这样 ...
- 时间工具类-Java
1.根据传入时间获取该时间所在季度的第一天 /** * 根据传入时间获取传入日期所在季度的第一天的日期 * * @param startDate * @return */ public static ...
- 香橙派上的eMMC分区
准备工作 OrangePi Plus 2E(自带16G的eMMC存储,出厂默认eMMC中附带了Android系统,用于测试板子功能) Ubuntu16.04的TF卡 第一张方式: 该方式可以按需删除指 ...
- ChatGPT 火了,一大批开源平替也来了
ChatGPT 凭一己之力让全球为 AI 沸腾,引发了科技巨头之间的聊天机器人军备竞赛. 众所周知,ChatGPT 的背后技术是 GPT(Generative Pre-trained Transf ...
- unordered_map模拟实现|STL源码剖析系列|开散列
博主很久没有更新过STL源码剖析这个系列的文章了,主要是因为大部分STL常用的容器,博主都已经发过文章了,今天博主带着大家把哈希表也模拟实现一下. 前言 那么这里博主先安利一下一些干货满满的专栏啦! ...
- 解决:docker开启mongo镜像
首先通过docker pull mongo拉取mongo镜像 (如果带版本,拉取为响应版本,若不带版本则拉取最新版本) 开启 mongodb 容器 可以选择将宿主机的mongo工作目录进行共享,作为d ...