day09-电话号码的字母组合
给定一个仅包含数字 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 <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
解题思路:
-
创建二维数组用于表示号码键和英文字母的映射:
strMapping[2-2]:["a","b","c"] strMapping[3-2]:["d","e","f"] strMapping[4-2]:["g","h","i"] ... strMapping[8-2]:["t","u","v"] strMapping[9-2]:["w","x","y","z"]
-
利用入队出队依次遍历号码的每个字母:
以"23"为例解释说明: 1、 对于i=0时digits.charAt(i)=='2',digits.charAt(i)-'0'==2,strMapping[digits.charAt(i)-'0'-2]==strMapping[0]==["a","b","c"]。 letterCombinationsByQueue(queue,["a","b","c"]);此时队列为空,会依次将"a","b","c"放入队列中, 此时队列queue中为c,b,a,size为3。 2、 对于i=1时digits.charAt(i)=='3',digits.charAt(i)-'0'==3,strMapping[digits.charAt(i)-'0'-2]==strMapping[1]==["d","e","f"]。 letterCombinationsByQueue(queue,["d","e","f"]);此时队列不为空,队列queue中为c,b,a,size为3。 int length = queue.size()==3;外层循环次数为3,刚好取出队列中最先入队的a,b,c三个字符串。 取出a,依次和["d","e","f"]拼接,然后再次入队,队列queue中为af,ae,ad,c,b; 取出b,依次和["d","e","f"]拼接,然后再次入队,队列queue中为bf,be,bd,af,ae,ad,c; 取出c,依次和["d","e","f"]拼接,然后再次入队,队列queue中为cf,ce,cd,bf,be,bd,af,ae,ad; 3、 当i=2时,大于digits.length()-1,结束循环,遍历队列取出每个字符串放入list集合并返回。
解题代码:
class Solution {
public List<String> letterCombinations(String digits) {
String[][] strMapping = new String[][]{{"a","b","c"},{"d","e","f"},{"g","h","i"},{"j","k","l"},{"m","n","o"},{"p","q","r","s"},{"t","u","v"},{"w","x","y","z"}};
List<String> list = new ArrayList();
if(digits.length()==0){
return list;
}
Queue<String> queue = new LinkedList();
for(int i=0; i<=digits.length()-1;i++){
letterCombinationsByQueue(queue,strMapping[digits.charAt(i)-'0'-2]);
}
for (String s : queue) {
list.add(s);
}
return list;
}
public void letterCombinationsByQueue(Queue<String> queue,String[] str){
if(queue.size()==0){
for(int i=0;i<str.length;i++){
queue.add(str[i]);
}
}else{
int length = queue.size();
for(int i=1;i<=length;i++){
String s1 = queue.poll();
for(int j=0;j<str.length;j++){
queue.add(s1+str[j]);
}
}
}
}
}
执行效率: