电话号码的字母组合

力扣题目链接(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. 对于Vue3和Ts的心得和思考

    作者:京东物流 吴云阔 1 前言 Vue3已经正式发布了一段时间了,各种生态已经成熟.最近使用taro+vue3重构冷链的小程序,经过了一段时间的开发和使用,有了一些自己的思考. 总的来说,Vue3无 ...

  2. 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了提升性能,使用 unsafe 代码来重构了凯撒加密的代 ...

  3. Prompt实战优化

    1.概述 在深度学习领域,Prompt(提示语)被广泛应用于自然语言处理任务中,如文本生成.机器翻译和问答系统等.Prompt的设计对模型的性能和生成结果有着重要的影响,因此在实际应用中合理而有效地利 ...

  4. Windows堆管理机制 [1] 堆基础

    声明:这篇文章在写的时候,是最开始学习这个堆管理机制,所以写得有些重复和琐碎,基于笔记的目的想写得全一些,这篇文章写的时候参考了很多前辈的文章,已在末尾标出,某些未提及到的可以在评论补充 基于分享的目 ...

  5. vim 从嫌弃到依赖(8)——使用命令模式编辑文本

    通过前面的文章,我们已经介绍了vim的普通模式.插入模式.可视模式.接下来让我们接着介绍vim中另一个强大的模式--命令行模式 命令模式简介 命令模式可以说在vim中的使用频率不亚于普通模式,像我们平 ...

  6. NLP涉及技术原理和应用简单讲解【二】:paddle(分布式训练、AMP自动混合精度训练、模型量化、模型性能分析)

    参考链接: https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/cluster_q ...

  7. python快速入门【四】-----各类函数创建

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  8. 从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

    项目代码以上传至码云,项目地址:https://gitee.com/breezefaith/vue-ts-scaffold 目录 前言 脚手架技术栈简介 vue3 TypeScript Pinia T ...

  9. RSAToken 的签名算法 SHA256withRSA、数字签名

    数字签名的意义,看下百科:数字签名sign可不是对数据的加密和解密,而是生成签名和验证签名. https://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E7%AD ...

  10. typescript json 转 bean

    3个文件: 1.UserInfoGetResponse.ts class UserInfoGetResponse{ private userId: number; private userName: ...