【刷题记录】17. 电话号码的字母组合

简介: 【刷题记录】17. 电话号码的字母组合

一、题目描述


来源:力扣(LeetCode)


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


二、思路分析


hashMap + DFS 深度优先搜索


  • 从题目中可以看出,每一个数字都对应字符数组。我们用可以map来存这个对应的关系
  • 其实每一个数字我们都可以看成一个树的节点,而对应的字符,就可以看作是这个节点下的分支
  • 每多一个数字,就相当于在分支的节点下多一个相应的情况分支。
  • 然后我们对这个树进行遍历即为我们想要的最终结果
    例如上面的示例 1:
    网络异常,图片无法展示
    |


代码实现

class Solution1 {
    Map<Character, String> map = new HashMap<Character, String>() {{
        put('2', "abc");
        put('3', "def");
        put('4', "ghi");
        put('5', "jkl");
        put('6', "mno");
        put('7', "pqrs");
        put('8', "tuv");
        put('9', "wxyz");
    }};
    public List<String> letterCombinations(String ds) {
        int length = ds.length();
        List<String> res = new ArrayList<>();
if (length ==0) return res;
        StringBuilder sb = new StringBuilder();
        dfs(ds, 0, length, sb, res);
        return res;
    }
    void dfs(String ds, int i, int n, StringBuilder sb, List<String> res) {
if (i == n) {
            res.add(sb.toString());
            return;
        }
        char key = ds.charAt(i);
        String letters = map.get(key);
for (int j =0; j < letters.length(); j++){
            sb.append(letters.charAt(j));
            dfs(ds, i +1 , n, sb, res);
            sb.deleteCharAt(sb.length() -1);
        }
    }
}


复杂度分析


时间复杂度:

网络异常,图片无法展示
|
,其中 m 是输入中对应 3 个字母的数字个数, n 是输入中对应 4 个字母的数字个数


空间复杂度:

网络异常,图片无法展示
|
。一共要生成
网络异常,图片无法展示
|
个结果


运行结果


网络异常,图片无法展示
|


总结


我们可以将问题模拟转为成我们相对比较熟悉的模型,这样能够帮助我们的更好的理解和更快的解决问题。

目录
相关文章
|
2月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
23 0
Leetcode第十七题(电话号码的字母组合)
|
2月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
42 0
|
4月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
6月前
17. 电话号码的字母组合
17. 电话号码的字母组合
|
7月前
|
存储 算法
17.电话号码的字母组合
17.电话号码的字母组合
38 0
|
7月前
|
Java
leetcode-17:电话号码的字母组合
leetcode-17:电话号码的字母组合
41 0
leetcode-17:电话号码的字母组合
|
存储 C++ 索引
电话号码的字母组合(C++实现)
电话号码的字母组合(C++实现)
77 0
|
机器学习/深度学习 算法 安全
LeetCode - #17 电话号码的字母组合
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
108 0
leetcode:17.电话号码的字母组合
可以抽象成一个排列组合的问题,题目的意思就是说当输入"23"的时候实际上就是按了两次按键,分别是2和3,然后2对应的是abc,3对应的是def,所以我们只需递归遍历每一种结果即可解决问题。
48 0
leetcode:17.电话号码的字母组合