[leetcode] 17. 电话号码的字母组合

文章讲述了如何使用深度优先搜索(DFS)算法解决LeetCode中的一个题目,将只包含2-9数字的字符串转换为字母组合。通过构建字符串数组表示数字与字母的对应关系,然后进行递归遍历,最终返回所有可能的字母组合列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

解题方法

dfs遍历

这是一道经典的dfs遍历题目。我们将数字和字母的对应关系存起来,可以存为字符串数组,数组索引代表数字,内容代表这个数字能表示的所有字符,索引0和1的位置存的是空字符串。接下来,我们对给出的数字字符串进行dfs遍历。由于比较简单,就不再大篇幅描述,具体实现可以参考以下代码。

java代码

public List<String> letterCombinations(String digits) {
    List<String> list = new ArrayList<>();
    if (digits.length() == 0) {
        return list;
    }
    String[] str = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    StringBuilder bd = new StringBuilder();
    letterCore(bd, str, list, digits, 0);
    return list;
}

// dfs遍历。bd存储组合的字符串;str为字母数组,对应索引为数字;list是结果集;digits是数字字符串;i为遍历深度,代表遍历到的第i个字符。
public void letterCore(StringBuilder bd, String[] str, List<String> list, String digits, int i) {
    // 当遍历深度与数字字符串长度相等时,list添加组合字符串,dfs遍历结束
    if (i == digits.length()) {
        list.add(bd.toString());
        return;
    }
    int num = digits.charAt(i) - '0';
    int length = str[num].length();
    int index = 0;
    while (index < length) {
        bd.append(str[num].charAt(index));
        letterCore(bd, str, list, digits, i + 1);
        bd.deleteCharAt(bd.length() - 1);
        index++;
    }
}

由于digits长度最长为4,每个数字可以代表的字母最多为4个(7和9分别可以代表4个字母),所以dfs遍历的次数最多为44=256。dfs的遍历深度最高为4,并不会栈溢出。

相似题目

[leetcode] 10. 正则表达式匹配
[leetcode] 22. 括号生成


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会飞的大鱼人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值