LeetCode 电话号码的字母组合

简介: LeetCode 电话号码的字母组合

电话号码的字母组合


题目


给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。


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



image.png


示例 1:


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


示例 2:


输入:digits = "" 输出:[]


示例 3:


输入:digits = "2" 输出:["a","b","c"]


提示:


0 <= digits.length <= 4 digits[i] 是范围 ['2', '9'] 的一个数字。


解题分析


解题思路:


核心思路: 回溯


  1. 对于电话号码的键盘,我们可以先把这些数字和字母的关系通过 Map 做一个映射关系。


  1. 对于回溯来说,其实本质的过程是是用递归来实现。 首先需要维护一个字符串,表示字母的排列。该字符串初始为空。每次取号码的一位数字,从哈希表中获取对应的所有可能字母, 并将其中的一个字母插入到已有的字母排列后面然后继续处理电话号码的最后一位数字,直到得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。


复杂度分析:


时间复杂度:O(3^m X 4^n)


空间负载度:O(m + n)


解题代码


public List<String> letterCombinations(String digits) {
  List<String> list = new ArrayList<>();
  if (digits.length() == 0) {
    return 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");
  backtrack(list, map, digits, 0, new StringBuffer());
  return list;
}
private void backtrack(List<String> list, Map<Character, String> map, String digits, int index, StringBuffer sb) {
  if (index == digits.length()) {
    list.add(sb.toString());
  } else {
    char digit = digits.charAt(index);
    String letters = map.get(digit);
    int letterCount = letters.length();
    for (int i=0; i < letterCount; i++) {
      sb.append(letters.charAt(i));
      backtrack(list, map, digits, index + 1, sb);
      sb.deleteCharAt(index);
    }
  }
}


参考资料


leetcode-cn.com/problems/le…


相关文章
|
12天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
2月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
4月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
4月前
|
存储 算法 安全
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
|
4月前
|
存储
力扣经典150题第四十二题:字母异位词分组
力扣经典150题第四十二题:字母异位词分组
26 0
|
4月前
|
存储
力扣经典150题第四十一题:有效的字母异位词
力扣经典150题第四十一题:有效的字母异位词
21 0
|
4月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
4月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
4月前
|
存储 算法 数据挖掘
leetcode第十七题:解密电话号码的字母组合与应用【python】
leetcode第十七题:解密电话号码的字母组合与应用【python】