day09-电话号码的字母组合

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

解题思路:

  1. 创建二维数组用于表示号码键和英文字母的映射:

    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"]
    
  2. 利用入队出队依次遍历号码的每个字母:

    以"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]);
                }
            }
        }
    }
}

执行效率:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值