题目

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

思考与递归程序

解空间树的宽度是输入数字对应的字符的个数,深度是输入的数字的个数。
确定回溯函数参数
与之前leetcode 216. 组合总和 III 思考分析一样,我们需要建立两个全局变量,一个存放叶子结点子结果,一个用来存放所有子结果。
参数:第一个是string digits(数字字符串),一个是int index.
用index记录遍历第几个数字了。

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

确定终止条件
当index等于数字个数时收集结果,返回。

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

单层逻辑
取第index个数字,并且找到对应的字符集。然后for循环这个字符集(for循环处理的是当层的树宽度有关数据)
同时注意原来的字符类型的数字,要进行转换。

int digit = digits[index]-'0';
string letters = letterMap[digit];     //取出对应的字符集
for(int i=0;i<letters.size();i++)
{res.push_back(letters[i]);backtracking(digits,index+1);res.pop_back();                //回溯
}

异常输入情况输入处理
如果输入1、*、#等字符时,我们应该返回并且打印出错误信息

//判断是否有非法字符
if(digits[index]=='0' || digits[index]=='1'|| digits[index]=='*'|| isValid == false)
{isValid=false;result.clear();//res.clear();       如果这里clear的话,返回到上一层的时候,会有个回溯操作res.pop,会导致报错return;
}

完整代码:

class Solution {public:const string letterMap[10]={"",     //0"",     //1"abc",  //2"def",  //3"ghi",  //4"jkl",  //5"mno",  //6"pqrs", //7"tuv",  //8"wxyz", //9};vector<string> result;string res;bool isValid =true;void backtracking(const string& digits,int index){if(index == digits.size()){result.push_back(res);return;}//判断是否有非法字符if(digits[index]=='0' || digits[index]=='1'|| digits[index]=='*'|| isValid == false){isValid=false;result.clear();//res.clear();return;}int digit = digits[index]-'0';string letters = letterMap[digit];      //取出对应的字符集for(int i=0;i<letters.size();i++){res.push_back(letters[i]);backtracking(digits,index+1);res.pop_back();               //回溯}}vector<string> letterCombinations(string digits) {result.clear();res.clear();isValid = true;if(digits.size() == 0) return result;backtracking(digits,0);if(isValid == false)    cout<<"输入的字符中有异常"<<endl;return result;}
};

对错误案例的测试:
很显然,力扣的测试程序中并没有考虑异常输入

语法细节

1、函数传参中
直接用string s相当于是拷贝了一份,而用&不用拷贝内存。
2、在函数中如果用不带const的引用会报错:
临时变量不能作为非const的引用参数,换句话说就是要引用临时变量必须带上const,这是c++的语法规范。
函数参数作为引用,函数就有责任把函数内存操作此参数的结果给出来。但是这个是一个临时变量,随时可能释放掉。所以为了避免这个现象,就加上一个规则,不带const的临时变量不让通过。

leetcode 17. 电话号码的字母组合 思考分析相关推荐

  1. [DFS|回溯法] leetcode 17 电话号码的字母组合

    [DFS|回溯法] leetcode 17 电话号码的字母组合 1.题目 题目链接 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...

  2. LeetCode 17电话号码的字母组合(搜索)18四数之和

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

  3. [LeetCode] 17. 电话号码的字母组合

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

  4. LeetCode 17. 电话号码的字母组合(回溯)

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

  5. leetcode —— 17. 电话号码的字母组合

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

  6. leetcode 17. 电话号码的字母组合

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

  7. C++ leetcode 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    一.解题思路 用map可以加快查询速度,DFS深度搜索,DFS是一种很常见的对于多循环或者n!的好的搜索算法. 二.代码:C++ void init(map<char, string> & ...

  8. LeetCode 17 电话号码的字母组合

    https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 解决方案 class Solution {public ...

  9. leetcode 17.电话号码的字母组合

    题目 解法 BFS + hash /* 广度遍历,利用队列实现 */ class Solution {private:unordered_map<char,string> tel_map; ...

最新文章

  1. (Shadow,Gradient)
  2. SAP 用户参数 ME_USE_GRID
  3. [Java核心技术(卷I)] - Java中的参数能做什么和不能做什么
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的餐厅收银管理系统
  5. SQL Server Management Studio –分步安装指南
  6. android源码分析(一) - 语言切换机制
  7. fiddler 查看接口响应时间
  8. Halcon学习笔记之OCR系列-喷码字体识别
  9. 深度学习赋能侧信道攻击
  10. 国内主要安全产品及厂商
  11. PPT学习笔记和技巧分享【持续更新ing】
  12. 神奇的泡泡java游戏,神奇的泡泡作文400字
  13. mysql rank函数怎么用_mysql rank函数怎么用
  14. 基于python实现开机自动连接校园网(广工商)
  15. 剖析供应链金融业务发展态势及提升路径
  16. 全球与中国无线视频门铃对讲机市场深度研究分析报告
  17. android pos机打印
  18. macOS安装软件./configuredmake
  19. spark使用之ALS版本对比
  20. 4年小Java的心路历程,绝对干货分享

热门文章

  1. 程序员外包避坑指南?
  2. JS文件信息收集工具-LinkFinder
  3. 某高校2006年招收学生3千人c语言,C语言程序设计例题
  4. oracle日志文件大小规则,修改oracle日志文件大小
  5. Jquery——hover与toggle
  6. 前端入行两年--教会了我这些道理
  7. response对象的使用
  8. 【[SHOI2015]超能粒子炮·改】
  9. PHP简单实现单点登录功能示例
  10. java如何从方法返回多个值