电话号码的字母组合
⛅前言
大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!
精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。
博客主页💖:知识汲取者的博客
LeetCode热题100专栏🚀:LeetCode热题100
Gitee地址📁:知识汲取者 (aghp) - Gitee.com
Github地址📁:Chinafrfq · GitHub
题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激
🔒题目
🔑题解
-
解法一:回溯+递归
思路和DFS比较类似,一层一层的搜索,然后搜索到最后一层时就直接返回结果。下面是我画的一个比较“抽象”的图解(画的不是很好,还请多多包涵🤣)
import java.util.*; /** * @author ghp * @title 电话号码的字母组合 */ class Solution { public static final Map<Character, String> phoneMap = new HashMap<Character, 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) { return Collections.emptyList(); } List<String> ans = new ArrayList<>(10); // 利用回溯,得到所有字母的组合 backtrack(ans, digits, 0, new StringBuffer()); return ans; } /** * 回溯 * * @param ans 所有字母的组合 * @param digits 输入的数字 * @param step 当前遍历的深度 * @param sb 用于拼接字符 */ private void backtrack(List<String> ans, String digits, int step, StringBuffer sb) { if (step == digits.length()){ // 已经遍历到最后一层了,结束递归 ans.add(sb.toString()); return; } // 获取当前这一层数字对应的字母 char digit = digits.charAt(step); String letters = phoneMap.get(digit); for (int i = 0; i < letters.length(); i++) { // 获取当前层的字母 sb.append(letters.charAt(i)); // 递归获取下一层的字母 backtrack(ans, digits, step+1, sb); // 恢复现场,用于回溯 sb.deleteCharAt(step); } } }
复杂度分析:
- 时间复杂度: O ( 3 m ∗ 4 n ) O(3^m*4^n) O(3m∗4n)
- 空间复杂度: O ( m + n ) O(m+n) O(m+n)
其中 n 、 m n、m n、m 分别为数字对应的字母的个数 和 输入数字的个数