题目:

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

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

示例:

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

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。


解法一:迭代法

将原数组中的值加上当前值得可能性进行组合,

比如第一个数字2,对应的就是abc,这时 候数组中的值就是[a,b,c]

轮到下一个数字3,对应的是def,就把a拼上d/e/f,b拼上d/e/f,c拼上d/e/f, 返回数组

java代码:

class Solution {public List<String> letterCombinations(String digits) {HashMap<Character, String[]> map = new HashMap<>();map.put('2', new String[]{"a", "b", "c"});map.put('3', new String[]{"d", "e", "f"});map.put('4', new String[]{"g", "h", "i"});map.put('5', new String[]{"j", "k", "l"});map.put('6', new String[]{"m", "n", "o"});map.put('7', new String[]{"p", "q", "r", "s"});map.put('8', new String[]{"t", "u", "v"});map.put('9', new String[]{"w", "x", "y", "z"});int len = digits.length();List<String> res = new ArrayList<>();for (int i = 0; i < len; i++) {String[] tmp = map.get(digits.charAt(i));List<String> listTmp = new ArrayList<>();if (i == 0) {for (String s : tmp) {res.add(s);}} else {for (int j = 0; j < res.size(); j++) {for (String s : tmp) {listTmp.add(res.get(j) + s);}}res = listTmp;}}return res;}
}

解法二:回溯法

把每个数字字符当作递归的一层,每一层中先枚举一个字母,

递归进入下一层,再删除这个字母,回到上一个状态,枚举下一个字母。

递归结束标志是递归了digits.length层,即字母组合长度等于digits长度,

递归结束得到一个符合的字母组合,加入list。等于是在循环中套递归

java代码:

class Solution {public List<String> letterCombinations(String digits) {Map<Character, String[]> map = new HashMap<>();map.put('2', new String[]{"a", "b", "c"});map.put('3', new String[]{"d", "e", "f"});map.put('4', new String[]{"g", "h", "i"});map.put('5', new String[]{"j", "k", "l"});map.put('6', new String[]{"m", "n", "o"});map.put('7', new String[]{"p", "q", "r", "s"});map.put('8', new String[]{"t", "u", "v"});map.put('9', new String[]{"w", "x", "y", "z"});int len = digits.length();List<String> res = new ArrayList<>();if (len == 0) {return res;}String oneRes = "";combi(digits, 0, res, oneRes, map);return res;}private void combi(String digits, int i, List<String> res, String oneRes, Map<Character, String[]> map) {if (i == digits.length()) {res.add(oneRes);return;}String[] tmp = map.get(digits.charAt(i));for (String s : tmp) {oneRes += s; //把这个字母加入oneRescombi(digits, i + 1, res, oneRes, map);oneRes = oneRes.substring(0, oneRes.length() - 1);//把s从oneRes中删除(这个如果不好理解,可以举个例子23,在纸上走一遍)}}
}

由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!

推荐阅读:

【leetcode-动态规划】爬楼梯  - CSDN博客

【leetcode-动态规划】买卖股票的最佳时机  - CSDN博客

【leetcode-动态规划】最大子序和

【leetcode-动态规划】 不同路径  - CSDN博客

【leetcode-动态规划】打家劫舍

【leetcode-动态规划】 跳跃游戏  - CSDN博客

【leetcode-动态规划】零钱兑换  - CSDN博客

【leetcode】电话号码的字母组合相关推荐

  1. Leetcode 电话号码的字母组合

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

  2. 树:BFS,DFS解Leetcode电话号码的字母组合问题

    问题描述: 题目:Leetcode 第17题 难度:中等 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数字到字母的映射如下(与电话按键相同).注 ...

  3. leetcode:电话号码的字母组合--java,dfs

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

  4. 《LeetCode力扣练习》第17题 电话号码的字母组合 Java

    <LeetCode力扣练习>第17题 电话号码的字母组合 Java 一.资源 题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数 ...

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

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

  6. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  7. 【LeetCode】【HOT】17. 电话号码的字母组合(递归)

    [LeetCode][HOT]17. 电话号码的字母组合 文章目录 [LeetCode][HOT]17. 电话号码的字母组合 package hot;import java.util.ArrayLis ...

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

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

  9. Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合

    题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...

  10. LeetCode | 0017. Letter Combinations of a Phone Number电话号码的字母组合【Python】

    LeetCode 0017. Letter Combinations of a Phone Number电话号码的字母组合[Medium][Python][回溯][DFS][暴力] Problem L ...

最新文章

  1. php redis search,php redis类
  2. 一种电子病历系统软件框架思想
  3. UIAlertview改变按钮位置 大小
  4. 【Paper】2017_The distributed optimal consensus algorithms for general linear multi-agent systems
  5. 杜克大学计算机科学专业,杜克大学计算机科学专业研究生留学申请条件高不高?...
  6. 抛硬币直到连续若干次正面
  7. java提高篇之详解内部类
  8. 怎样快速画出一个正方体_小学数学非常有效的“画图”解题法,快速解题的“金钥匙”...
  9. python批量图片转pdf,用python 制作图片转pdf工具
  10. winform窗体对象 单例模式与泛型结合
  11. 群发的我不回??!!
  12. Java并发(9)- 从同步容器到并发容器
  13. Ubuntu18.04安装Android Studio
  14. smarty 模板不能正常加载css,js的问题
  15. Linux之 find之 ctime,atime,mtime
  16. Segmentree beats!---吉如一线段树学习笔记
  17. 三国古城和108将地图已恢复
  18. 网页播放Flash视频尝试的三种方式
  19. 鸿蒙申请入口联系人邮箱格式不对,为什么appid输入邮箱地址不对
  20. batch批处理文件(一)——batch概念以及echo off

热门文章

  1. React Native仿美团下拉菜单
  2. Excel怎么快速提取出网址
  3. Tensorflow XLA
  4. 软件工程 3:模块化设计
  5. Java并发的一些总结(面试须知)
  6. Python+selenium注册唯一账号
  7. 进行拨测的主要目的都有哪些?
  8. android 按钮添加图片并靠左显示
  9. CocosCreator之KUOKUO趣味文章:小怪要绕墙 3
  10. Tomcat传url地址中的特殊字符无法识别问题