要求

  • 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合
  • 1 不对应任何字母

  

示例

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

思路

  • 递归向后一位一位生成所有可能字符串
  • s(digits)是digits所能生成的字符串
  • letter(digits[0])是按键digits[0]对应的字符

实现

  • res作为类的私有成员变量
  • 调试代码:30,36,45,49
 1 #include <vector>
2 #include <iostream>
3 #include <string>
4 #include <assert.h>
5
6 using namespace std;
7
8 class Solution {
9
10 private:
11 const string letterMap[10] = {
12 " ",
13 "",
14 "abc",
15 "def",
16 "ghi",
17 "jkl",
18 "mno",
19 "pqrs",
20 "tuv",
21 "wxyz"
22 };
23
24 vector<string> res;
25 // 处理第index位数字
26 // s保存digits[0...index-1]生成的字符串
27 // 找到和digits[index]匹配的字母,获得digits[0...index]生成的解
28 void findCombination(const string &digits, int index, const string &s){
29
30 cout<<index<<" : "<<s<<endl;
31
32 // 终止条件
33 if( index == digits.size() ){
34 // s是一个解,保存
35 res.push_back(s);
36 cout<<"get "<<s<<" , return"<<endl;
37 return;
38 }
39
40 char c = digits[index];
41 assert( c >= '0' && c <= '9' && c != '1' );
42 string letters = letterMap[c-'0'];
43
44 for( int i = 0 ; i < letters.size() ; i ++ ){
45 cout<<"digits["<<index<<"] = "<<c<<" , use "<<letters[i]<<endl;
46 // 处理第index+1位数字
47 findCombination(digits, index + 1, s + letters[i] );
48 }
49 cout<<"digits["<<index<<"] = "<<c<<" complete, return"<<endl;
50 return;
51 }
52 public:
53 vector<string> letterCombinations(string digits) {
54
55 // 初始化
56 res.clear();
57 // 边界情况
58 if( digits == "" )
59 return res;
60
61 findCombination(digits, 0, "");
62
63 return res;
64 }
65 };
66
67 int main(){
68
69 vector<string> res = Solution().letterCombinations("23");
70 for( int i = 0 ; i < res.size() ; i ++ )
71 cout<<res[i]<<endl;
72
73 return 0;
74 }

  

总结

  • 本质是回溯(递归调用到底后,返回上一层,继续调用,直到根节点的所有可能性调用完成)
  • 回溯是一种算法思想,可通过递归实现
  • 和多重循环的区别在于,要处理的字符长度未知
  • 动态规划的本质是在回溯的基础上进行改进,提高效率
  • 复杂度:3^n(指数级O(2^n),n个字母,每个数字3个字母)
  • 暴力枚举解法,效率低,家用计算机n<20

相关

  • 93 Restore IP Addresses
  • 131 Palindrome Partitioning

参考

递归与回溯有什么区别?怎么区分?

https://coding.imooc.com/learn/questiondetail/19706.html

[刷题] 17 Letter Combinations of a Phone Number的更多相关文章

  1. 刷题17. Letter Combinations of a Phone Number

    一.题目说明 题目17. Letter Combinations of a Phone Number,题目给了下面一个图,输入一个字符串包括2-9,输出所有可能的字符组合. 如输入23所有可能的输出: ...

  2. [LeetCode][Python]17: Letter Combinations of a Phone Number

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 17: Letter Combinations of a Phone Numb ...

  3. Leetcode 17. Letter Combinations of a Phone Number(水)

    17. Letter Combinations of a Phone Number Medium Given a string containing digits from 2-9 inclusive ...

  4. 《LeetBook》leetcode题解(17):Letter Combinations of a Phone Number[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  5. [LeetCode] 17. Letter Combinations of a Phone Number 电话号码的字母组合

    Given a string containing digits from 2-9inclusive, return all possible letter combinations that the ...

  6. 17. Letter Combinations of a Phone Number

    题目: Given a digit string, return all possible letter combinations that the number could represent. A ...

  7. Leetcode 17.——Letter Combinations of a Phone Number

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  8. 【一天一道LeetCode】#17. Letter Combinations of a Phone Number

    一天一道LeetCode (一)题目 Given a digit string, return all possible letter combinations that the number cou ...

  9. [leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

    Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...

随机推荐

  1. JS中dom操作的事件

    Click--点击事件 优先级:dom.onclick 高于标签上的onClick属性 监听事件 --不会覆盖前面的事件效果 dom.addEventListener()    括号里面有三个参数 1 ...

  2. python基础(六):列表的使用(下)

    列表排序的三种方式 sort()方法:原地修改列表的排序方法 注 1:" 默认是升序" ,参数 reverse=True,表示将列表降序. 注 2:" 原地修改列表&qu ...

  3. 带你全面认识CMMI V2.0(五)——改进

    改进(Improving)涉及开发.管理和改进过程及其相关资产,其主要重点是提高组织绩效.保持习惯和持久性可确保过程在整个组织中是持久.习惯性地执行和维持,并有助于有效地实现业务绩效目标.治理(GOV ...

  4. upload-labs通关历程

    使用靶场前,先配置php版本为5.2,和下列对应配置. php.ini magic_quotes_gpc  Off php<5.3.4 httpd.conf AddType applicatio ...

  5. 使用Vanilla框架制作时间倒数器 ——JavaScript

    一.制作时间倒数器要求以及思路:   1.首先创建三个输入字段,分别是小时,分钟和秒,以及"开始"按钮.输入的初始值必须为0h 5m 0s.当用户输入小时,分钟和秒并单击" ...

  6. teprunner测试平台测试计划批量运行用例

    本文开发内容 上一篇文章已经把pytest引入到测试平台中,通过多线程和多进程的方式,运行测试用例.有了这个基础,做批量运行用例的功能就很简单了,只需要前端传入一个CaseList即可.本文的后端代码 ...

  7. python进阶(3)--条件判断、用户输入

    文档目录: 一.if语句二.检索条件三.用户输入input四.while+inoput(),让用户选择何时退出五.break与continue六.while循环处理字典和列表 ------------ ...

  8. Spring (三)SpringAoP

    1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能 ...

  9. Seata搭建与分布式事务入门

    在单体架构下,我们大多使用的是单体数据库,通过数据库的ACID特性支持,实现了本地事务.但是在微服务架构下复杂的业务关系中,分布式事务是不可避免的问题之一.Seata是Spring Cloud Ali ...

  10. 大学四年,总结一套适合小白的Java自学路线和方法

    前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...