Leetcode算法Java全解答–17. 电话号码的字母组合

文章目录

  • Leetcode算法Java全解答--17. 电话号码的字母组合
    • 题目
    • 想法
    • 结果
    • 总结
    • 代码
      • 我的答案
      • 大佬们的答案
      • 测试用例
    • 其他

题目

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
digitToLetter[‘2’]=“abc”;
digitToLetter[‘3’]=“def”;
digitToLetter[‘4’]=“ghi”;
digitToLetter[‘5’]=“jkl”;
digitToLetter[‘6’]=“mno”;
digitToLetter[‘7’]=“pqrs”;
digitToLetter[‘8’]=“tuv”;
digitToLetter[‘9’]=“wxyz”;

示例:


示例:输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

想法

  1. 循环0~length-1

将原数组中的值加上当前值得可能性

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

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

返回数组
2. 回溯法

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

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

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

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

结果

  •  超过99%的测试案例
    
  •  时间复杂度:n2
    
  •  空间复杂度:n
    

总结

没有用递归的方式,直接使用迭代的方法

代码

我的答案

/**************************************
* 题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
digitToLetter['2']="abc";
digitToLetter['3']="def";
digitToLetter['4']="ghi";
digitToLetter['5']="jkl";
digitToLetter['6']="mno";
digitToLetter['7']="pqrs";
digitToLetter['8']="tuv";
digitToLetter['9']="wxyz";示例:输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
**************************************//**************************************
*
* 想法:
*      1. 循环0~length-1
*          将原数组中的值加上当前值得可能性
*              比如第一个数字2,对应的就是abc,这时候数组中的值就是[a,b,c]
*              轮到下一个数字3,对应的是def,就把a拼上d/e/f
*          返回数组
*      2. 回溯法
*          把每个数字当作递归的一层,每一层中先枚举一个字母,
*          递归进入下一层,再删除这个字母,回到上一个状态,枚举下一个字母。
*          递归结束标志是递归了digits.lengtgh层,即字母组合长度等于digits长度,
*          递归结束得到一个符合的字母组合,加入list。等于是在循环中套递归
* 我的做法
*      超过99%的测试案例
*      时间复杂度:n2
*      空间复杂度:n
* 代码执行过程:
*
* 总结:
*      没有用递归的方式,直接使用迭代的方法
*
*
* ***********************************/
public List<String> letterCombinations(String digits) {if (digits.length() == 0) {return Collections.EMPTY_LIST;
}Map<Character, String> map = new HashMap<>();
map.put('2', "abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");char[] chars = digits.toCharArray();
List<String> result = new ArrayList<>();
result.add("");for (char c : chars) {List<String> tmpList = new ArrayList<>();String sufStr = map.get(c);for (String str : result) {for (Character tmpC : sufStr.toCharArray()) {String tmpStr = str + tmpC;tmpList.add(tmpStr);}}result = tmpList;
}return result;
}

大佬们的答案

/*************************************** 比我好的答案 better* ***********************************/
public List<String> better(String digits) {List<String> res = new ArrayList<>();String oneRes = "";if (digits.equals("")) {return res;}String[] dict = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };int[] digiInt = new int[digits.length()];for (int i = 0; i < digits.length(); i++) {digiInt[i] = digits.charAt(i) - '0';}combi(digiInt, 0, dict, res, oneRes);return res;
}public void combi(int[] digits, int n, String[] dict, List<String> res, String oneRes) {if (n == digits.length) {res.add(oneRes);return;}for (int j = 0; j < dict[digits[n]].length(); j++) {oneRes = oneRes + dict[digits[n]].charAt(j);combi(digits, n + 1, dict, res, oneRes);oneRes = oneRes.substring(0, oneRes.length() - 1);}
}

测试用例

@Test
public void test017() {// 创建测试案例String str1 = "23";// 测试案例期望值String[] strings = new String[] { "ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf" };List<String> expResult1 = Arrays.asList(strings);//        expResult1.addAll(strings);// 执行方法Solution017 solution017 = new Solution017();List<String> result1 = solution017.letterCombinations(str1);List<String> result11 = solution017.better(str1);// 判断期望值与实际值Assert.assertEquals(expResult1, result1);Assert.assertEquals(expResult1, result11);}

其他

代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan

“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改

如有疑问请联系,联系方式:QQ3060507060

Leetcode算法Java全解答--17. 电话号码的字母组合相关推荐

  1. Leetcode算法Java全解答--41. 缺失的第一个正数

    Leetcode算法Java全解答–41. 缺失的第一个正数 文章目录 Leetcode算法Java全解答--41. 缺失的第一个正数 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 ...

  2. Leetcode算法Java全解答--37. 解数独

    Leetcode算法Java全解答–37. 解数独 文章目录 Leetcode算法Java全解答--37. 解数独 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 编写一个 ...

  3. Leetcode算法Java全解答--19. 删除链表的倒数第N个节点

    Leetcode算法Java全解答–19. 删除链表的倒数第N个节点 文章目录 Leetcode算法Java全解答--19. 删除链表的倒数第N个节点 题目 想法 结果 总结 代码 我的答案 大佬们的 ...

  4. Leetcode算法Java全解答--12. 整数转罗马数字

    Leetcode算法Java全解答–12. 整数转罗马数字 文章目录 Leetcode算法Java全解答--12. 整数转罗马数字 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 ...

  5. Leetcode算法Java全解答--75. 颜色分类

    Leetcode算法Java全解答–75. 颜色分类 文章目录 Leetcode算法Java全解答--75. 颜色分类 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...

  6. Leetcode算法Java全解答--60. 第k个排列

    Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...

  7. Leetcode算法Java全解答--73. 矩阵置零

    Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...

  8. Leetcode算法Java全解答--16. 最接近的三数之和

    Leetcode算法Java全解答–16. 最接近的三数之和 文章目录 Leetcode算法Java全解答--16. 最接近的三数之和 题目 想法 结果 总结 代码 我的答案 暴力破解 滑动列表 大佬 ...

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

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

最新文章

  1. cnn风格迁移_快速图像风格迁移思想在无线通信中的另类应用:算法拟合
  2. 模拟STL链表类的实现
  3. where is document CURRENCY field stored
  4. QGIS中如何加载identify
  5. html5标签属性大全_HTML/HTML5 知识点思维导图
  6. 收获,不止SQL优化——抓住SQL的本质--第五章
  7. 分布式文件系统之MogileFS的使用
  8. 微信公开课讲师王泓渊:小游戏开放能力
  9. MOOON-agent系统设计与使用说明
  10. 简单易懂的排序算法演示
  11. 如何开发和维能hold住全场的软件
  12. 《云网络:数字经济的连接》图书发布会将于7月16日在杭举行
  13. CANape a2l文件的编辑教程
  14. Spark生态之Alluxio学习15--alluxio性能分析和加速方式
  15. ​【预测模型】基于粒子群算法优化最小二乘支持向量机实现数据分类matlab代码
  16. java中如何写像下雨_雨声像什么的比喻句,形容下雨的声音的句子
  17. js颜色排序动画js特效
  18. (一)泛函分析(江泽坚)习题解答
  19. 与孔子同世之闻人少正卯
  20. uniapp 自定义showToast样式

热门文章

  1. C#实现生成db文件
  2. springboot输出json格式日志
  3. 坊间传言的“阿里云上市”,有三好和三不好
  4. UML之行为图(活动图、状态图、交互图)
  5. 微信jsapi支付获取code_微信支付之JSAPI公众号支付详解
  6. 2021-2027中国LED障碍灯市场现状研究分析与发展前景预测报告
  7. 360浏览器怎么切换成兼容模式
  8. 互链脉搏联合赛迪研究院发布《2019年中国区块链产业园发展报告》
  9. CAPWAP隧道技分享
  10. android 设置scrollview 高度,Android ScrollView如何设置maxHeight