Leetcode 17. 电话号码的字母组合
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情。
❤️欢迎订阅java厂长《LeetCode每日一题》 ❤️
1、题目📑
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
注意:答案中不可以包含重复的三元组。
实例1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
实例2:
输入: digits = ""
输出: []
实例3:
输入: digits = "2"
输出: ["a","b","c"]
提示:
0 <= digits.length <= 4digits[i]是范围['2', '9']的一个数字。
2、思路🧠
方法一:回溯
本题的难点在于循环回溯,对于入门小白来说,思维有难度。
假设输入是2,只有一个字符,如何解决?
for("abc") {
result = 'a' 'b' 'c'
}
假设输入是"23",只有两个字符,如何解决?
for("abc") {
"a"
"b"
"c"
for("def")
"d"
"e"
"f"
}
//得到结果["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
假设输入是"234",只有三个字符,如何解决?
for("abc") {
"a"
"b"
"c"
for("def")
"d"
"e"
"f"
for("ghi")
"g"
"h"
"i"
}
//得到结果就不用你展示了,大概已经明白了题目的意思吧
以"23"为例:
- 特判:如果数组的为
null或者 长度 < 0,直接返回空集合new ArrayList<>();。 - 初始化:
- 使用数组来存放题目中所给的数字对应的字母。
- 定义答案集合
res = new ArrayList<>();
- 循环回溯:(以2345为例)
- 第一次递归处理字符2,将字符调整"345"进行第二次递归函数
- 第二次递归处理字符3,将字符串改变成"45"后再次递归函数
- 第三次递归处理字符4,将字符串改变成"5"后继续递归函数
- 第四次递归处理字符5,将字符串改变成""后继续递归函数
- 递归到最后发现字符串已经为空串,将结果添加到列表并返回。
- 返回结果
res
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
class Solution {
String letterMap[] = {
" ", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
ArrayList<String> res = new ArrayList();
public List<String> letterCombinations(String digits) {
if(digits.equals(""))
return new ArrayList<>();
findCombination(digits, 0, "");
return res;
}
public void findCombination(String digits, int index, String s){
if(index == digits.length()){
res.add(s);
return;
}
Character c = digits.charAt(index);
String letters = letterMap[c - '0'];
for(int i = 0 ; i < letters.length() ; i ++){
findCombination(digits, index+1, s + letters.charAt(i));
}
return;
}
}
时间复杂度:O(3m × 4n) m对应输入中对应 3 个字母的数字个数,输入中对应 4 个字母的数字个数
空间复杂度:O(m + n)
4、总结
该题目的对重复解的去重进行考察和练习,同时对于数组要有排序的敏感度,对双指针的解法也要非常的熟悉,并且能够想到具体问题具体解决。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!