Leetcode 17. 电话号码的字母组合

1,266 阅读2分钟

Leetcode 17. 电话号码的字母组合

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

❤️‍欢迎订阅java厂长《LeetCode每日一题》 ❤️‍

1、题目📑

给定一个仅包含数字 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'] 的一个数字。

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"为例:

image-20220630213927759

  1. 特判:如果数组的为 null 或者 长度 < 0,直接返回空集合 new ArrayList<>();
  2. 初始化:
    • 使用数组来存放题目中所给的数字对应的字母。
    • 定义答案集合 res = new ArrayList<>();
  3. 循环回溯:(以2345为例)
    • 第一次递归处理字符2,将字符调整"345"进行第二次递归函数
    • 第二次递归处理字符3,将字符串改变成"45"后再次递归函数
    • 第三次递归处理字符4,将字符串改变成"5"后继续递归函数
    • 第四次递归处理字符5,将字符串改变成""后继续递归函数
    • 递归到最后发现字符串已经为空串,将结果添加到列表并返回。
  4. 返回结果 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)

image-20220630215607070

4、总结

该题目的对重复解的去重进行考察和练习,同时对于数组要有排序的敏感度,对双指针的解法也要非常的熟悉,并且能够想到具体问题具体解决。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:17. 电话号码的字母组合 - 力扣(LeetCode)