【Leetcode】17. 电话号码的字母组合(Letter Combinations of a Phone Number)

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

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

分析:

用递归就可以完成,但官方把他归进了回溯法,标题就写回溯法吧~

题目中要求给定包含2-9数字的长度为N的字符串,每个数字对应几个字母,求这些所有字母的组合,如图所示。

我们可以用Map的key存储数字2-9,用value存储这个数字对应的字母(例如,2对应abc)。

递归可以很好的解决这个问题,首先从字符串的index=0开始进入,根据Map上该key对应的value值(例如key=2,value="abc"),分别取这些字母,并进入到下一个过程中。

用Map存储的过程如下:

 Map<String, String> map = new HashMap<String, String>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};

可以看到,答案需要一个List<String>作为返回,我们则可以:

List<String> ans = new ArrayList<>();

接下来到了写函数,我们创建一个名为dfs的函数:

public void dfs(String digits, int step, String answer) {
if (step == digits.length()) {
ans.add(answer);
return;
} char c = digits.charAt(step);
String value = map.get(c +"");
for (int i = 0; i < value.length(); i++) {
dfs(digits, step + 1, answer + value.charAt(i));
}
}

整合一下,最后AC代码为:

class Solution {
List<String> ans = new ArrayList<>();
Map<String, String> map = new HashMap<String, String>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
public List<String> letterCombinations(String digits) {
if (digits.length() == 0 || digits == null)
return ans;
dfs(digits, 0, "");
return ans;
} public void dfs(String digits, int step, String answer) {
if (step == digits.length()) {
ans.add(answer);
return;
} char c = digits.charAt(step);
String value = map.get(c + "");
for (int i = 0; i < value.length(); i++) {
dfs(digits, step + 1, answer + value.charAt(i));
} }
}

Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)的更多相关文章

  1. [Swift]LeetCode17. 电话号码的字母组合 | Letter Combinations of a Phone Number

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

  2. 电话号码的字母组合 · Letter Combinations of a Phone Number

    [抄题]: Given a digit string excluded 01, return all possible letter combinations that the number coul ...

  3. Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)

    Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...

  4. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

  5. Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)

    Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...

  6. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  7. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  8. Leetcode之回溯法专题-78. 子集(Subsets)

    Leetcode之回溯法专题-78. 子集(Subsets) 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = ...

  9. Leetcode之回溯法专题-77. 组合(Combinations)

    Leetcode之回溯法专题-77. 组合(Combinations)   给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输 ...

随机推荐

  1. HashTable源码解读

    一:总述 底层实现原理是用数组+链表,与HashMap一样,但HashTable是线程安全的,HashMap是非线程安全的 下面是其结构图(与hashMap类似) 二:属性说明 /** * The h ...

  2. (原创)将Datatable数据按照Excel模板格式导出

    最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...

  3. activiti工作流委托功能的设计和实现

    最近公司开发一个项目,客户提出了一个需求,用户在出差的时候,可以将自己的工作进行委托.可以指定委托时间.委托工作内容.指定委托人等等内容. 然后我就上网查询资料,发现activiti工作流本身并不支持 ...

  4. Docker入门(初级)

    注意:命令基于centos7.5 一.什么是Docker? 通俗的理解,Docker就是虚拟机.但Docker不是虚拟机,Docker是对操作系统进行虚拟,而虚拟机是虚拟了一套或多套硬件,再在这虚拟的 ...

  5. HTTP 400 Bad request 原因

    我在使用httpclient 发送http请求时遇到问题,请求报 400 Bad request.网上都在说下面这两个原因 400 是 HTTP 的状态码,主要有两种形式: 1.bad request ...

  6. Jmeter脚本录制--HTTP代理服务器

    Jmeter脚本录制功能依赖第三方工具Badboy,所以在安装了Jmeter之后,还需要再安装一个工具. Badboy本身自带浏览器,相关操作只能在Badboy上进行操作,偶尔可能会遇到浏览器兼容的问 ...

  7. Another option to bootup evidence files

    When it comes to booting up evidence files acquired from target disk, you got two options. One is VF ...

  8. 4. 源码分析---SOFARPC服务端暴露

    服务端的示例 我们首先贴上我们的服务端的示例: public static void main(String[] args) { ServerConfig serverConfig = new Ser ...

  9. 拉格朗日对偶性(Lagrange duality)

    目录 拉格朗日对偶性(Lagrange duality) 1. 从原始问题到对偶问题 2. 弱对偶与强对偶 3. KKT条件 Reference: 拉格朗日对偶性(Lagrange duality) ...

  10. javaweb入门-----jsp概念

    jsp是什么? JSP:Java Server Pages java服务器端页面 *可以理解为 一个特殊的页面,其中既可以直接定义html标签,又可以定义java代码 *用于简化书写 <% %& ...