电话号码的字母组合

力扣题目链接(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. [转帖]使用Linux命令快速查看某一行

      原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 当年,我还是Linux菜鸟的时候,就在简历上写着精通Linux命令了,而当面试官问我"如何快速查看 ...

  2. [转帖]Redis之安全措施

    指令安全 Redis的一些指令会对Redis服务的稳定性及安全性各方面造成影响,例如keys指令在数据量大的情况下会导致Redis卡顿,flushdb和flushall会导致Redis的数据被清空. ...

  3. 基于Basic auth 的一个C# 示例

    最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据.在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证.天呢,它好不安全,容易被不法人监听,咋还在使用呀.但是没办法呀, ...

  4. mac接入两根网线

    mac机接了USB扩展槽之后,扩展槽可以接入一根网线,机器自带一个网线口,这样就可以同时接入两根网线,为什么要这样做? 因为我所在的公司是分内外网的,研发的机器是内网环境,而打包机有时候需要联网,那么 ...

  5. 强化学习调参技巧一: DDPG算法训练动作选择边界值_分析解决

    1.原因: 选择动作值只在-1 1之间取值 actor网络输出用tanh,将动作规范在[-1,1],然后线性变换到具体的动作范围.其次,tanh激活区是有范围的,你的预激活变量(输入tanh的)范围太 ...

  6. BoostAsyncSocket 异步反弹通信案例

    Boost 利用ASIO框架实现一个跨平台的反向远控程序,该远控支持保存套接字,当有套接字连入时,自动存储到map容器,当客户下线时自动从map容器中移除,当我们需要与特定客户端通信时,只需要指定客户 ...

  7. SpringCloud-02-Nacos注册中心

    Nacos注册中心 1.认识Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件.相比Eureka功能更加丰富,在国内受欢迎程度较高. 2.安装Nacos 1 1.下载安装 ...

  8. 推荐一款接口自动化测试数据提取神器 JSonPath

    在之前分享中,给大家介绍过一篇:如何快速审核接口返回值全部字段解决方案,详见原文:接口自动化测试,一键快速校验接口返回值全部字段 .当时,提到解决这类问题,市面上常见的解决方案有两种: 根据业务校验需 ...

  9. SpringMVC的执行流程及初始化流程

    今天大致来看一下Spring MVC的执行流程和初始化流程是什么样的 1,执行流程:也就是一个请求是怎么到我们Controller的 2,初始化流程:也就是那些 HandlerMapping.Hand ...

  10. 19.2 显式加载/隐式加载--《Windows核心编程》

    部分笔记来自于:https://blog.csdn.net/blade1080/article/details/81364161 注:关于DLL存放位置,一般是放到可执行文件的目录下. 下面时加载程序 ...