【力扣高频题】017.电话号码的字符组合

最近,25 大厂的 秋招提前批 已经开始了!!!

有想去大厂实习或面试的小伙伴需要抓住 提前批 的机会,先试试水噢!!!

但有些小伙伴不够自信,担心自己实力不够,纠结要不要投提前批。害怕如果面试时印象不好,可能会影响后续的秋招录取。

对于准备得不太充分的小伙伴,其实也不用过于慌张。无论提前批有没有开始,都要 稳住自己的节奏,尽量 不被外界的节奏带偏 ,自己做好充分准备后再猛冲也不晚。

小编这里准备了一份 Java 八股文面试题,有需要的小伙伴可以 关注公众号,回复关键词 「1024」 获得。

速刷一遍,查漏补缺!!!

另外,想 系统刷题 的小伙伴也可以点击链接了解下 八股文小程序 ,助力面试顺利,Offer 拿到手软!!!


言归正传,今天我们继续来学习 「力扣高频题」 系列。

17. 电话号码的字母组合

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

思路分析

该题的背景意义就是“九键输入”,按其中一个数字后会出现对应的字母,要求返回所有的字母组合情况。

因此,首先需要有将数字和字母对应起来的方法,这里可以采用 字符类型 的二维数组。

注意: 按键的首个数字为2,对应下标为0,需要进行下标的变换。

根据遍历到的数字,去取对应的字母,暂存入到目前的结果串中,并继续深度优先遍历,直至遍历完所有的数字后,收集最终的答案串。

递归的准备

定义递归函数的功能:index下标开始按数字,最终会产生什么样的结果。

思考递归需要的参数: 数字串str,此时来到的下标index,在index之前已经产生了什么结果path,最终的答案列表ans

  • 这里一定要记得存之前的结果(回溯后还能找到)。

明确递归的边界条件: 当下标来到最后,即等于数字字符串的长度时,结束,收集最终答案。

代码

public static char[][] phone = {
        {'a', 'b', 'c'}, // 2 -> 0
        {'d', 'e', 'f'}, // 3 -> 1
        {'g', 'h', 'i'}, // 4 -> 2
        {'j', 'k', 'l'}, // 5 -> 3
        {'m', 'n', 'o'}, // 6 -> 4
        {'p', 'q', 'r', 's'}, // 7 -> 5
        {'t', 'u', 'v'}, // 8 -> 6
        {'w', 'x', 'y', 'z'}, // 9 -> 7
};

public static List<String> letterCombinations(String digits) {
    List<String> ans = new ArrayList<>();
    if (digits == null || digits.length() == 0) {
        return ans;
    }
    char[] str = digits.toCharArray();
    char[] path = new char[str.length];
    // 从下标 0 开始递归,即所以按键按完后的最终答案
    process(str, 0, path, ans);
    return ans;
}

// str[0 ... index-1],按出的结果存入 path 里
// str[index...] 按完之后,最终会产生哪些组合,放入到 ans 里
public static void process(char[] str, int index, char[] path, List<String> ans) {
    if (index == str.length) {
        ans.add(String.valueOf(path));
    } else {
        // 注意下标的变换
        char[] cands = phone[str[index] - '2'];
        // 遍历当前数字中的每一个字母
        for (char cur : cands) {
            path[index] = cur;
            // 递归调用,深度优先遍历
            process(str, index + 1, path, ans);
        }
    }
}

「力扣高频题」 系列文章 已经更新不少了,有想刷力扣的小伙伴可以 收藏下方合集 逐题开刷~~~

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!
回复「1024」获取 Java 面试资源 ~
回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~

在看 + 转发

让你的小伙伴们一起来学算法吧!!

  • 52
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强连通子图

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值