LeetCode 17. Letter Combinations of a Phone Number题目分析代码

题目

给一个不包含01的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。

下图的手机按键图,就表示了每个数字可以代表的字母。

Paste_Image.png

注意事项

以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。

样例 给定 "23"

返回 ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

分析

深度搜索方法和回溯法

代码

public class Solution {
    /**
     * @param digits A digital string
     * @return all posible letter combinations
     */
    public ArrayList<String> letterCombinations(String digits) {
        ArrayList<String> res = new ArrayList<>();
        
        
        HashMap<Character, char[]> map = new HashMap<>();
        
        map.put('0', new char[] {});
        map.put('1', new char[] {});
        map.put('2', new char[] { 'a', 'b', 'c' });
        map.put('3', new char[] { 'd', 'e', 'f' });
        map.put('4', new char[] { 'g', 'h', 'i' });
        map.put('5', new char[] { 'j', 'k', 'l' });
        map.put('6', new char[] { 'm', 'n', 'o' });
        map.put('7', new char[] { 'p', 'q', 'r', 's' });
        map.put('8', new char[] { 't', 'u', 'v'});
        map.put('9', new char[] { 'w', 'x', 'y', 'z' });
        
        StringBuilder sb = new StringBuilder();
        
        dfs(res, digits, sb, map);
        
        return res;
    }

    private void dfs(ArrayList<String> res, String digits, StringBuilder sb, HashMap<Character, char[]> map) {
        if(digits.length() == sb.length())
        {
            res.add(sb.toString());
            return;
        }
        
        for(char c : map.get(digits.charAt(sb.length()))) {
            sb.append(c);
            dfs(res, digits, sb, map);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

010 有顺序的Map的实现类:TreeMap和LinkedHashMap

Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。 HashMap   说到Map,首先能想起的是HashMap,它是一个最常用的Map,...

3625
来自专栏Golang语言社区

Golang语言--布尔型和数值类型

布尔类型 布尔类型是 bool。Go语言提供了内置的布尔值true和flase。Go语言支持标准的逻辑和比较操作。这些操作的结果都是布尔值。 布尔值和表达式可以...

3848
来自专栏码代码的陈同学

Java基础之你会在foreach遍历集合时进行remove操作吗?

当通过for循环遍历集合时,一般禁止操作(add or remove)集合元素。虽然开发规范里写的非常清楚,但最近还是有人掉坑里导致出了一个小BUG,那我们就一...

1586
来自专栏Python爬虫实战

LeetCode刷题:Array系列之Remove Element

#include <iostream> #include <vector> using namespace std;

811
来自专栏无题

Java容器各实现类的底层实现原理概述

Java容器各实现类的底层实现原理概述 ArrayList实现原理要点概括 参考文献:http://zhangshixi.iteye.com/blog/67...

4336
来自专栏Android知识点总结

Java容器源码攻坚战--第一战:Iterator

961
来自专栏积累沉淀

Java设计模式(十六)----迭代子模式

迭代子模式 一、 概述 二、 结构 1.白箱聚集与外禀迭代子 2.黑箱聚集与内禀迭代子 主动...

21710
来自专栏专注 Java 基础分享

堆结构的优秀实现类----PriorityQueue优先队列

     之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap。他们都各自有各自的优...

2516
来自专栏Android机动车

Java 基础(四)——集合源码解析 List

前面我们学习了Iterator、Collection,为集合的学习打下了基础,现在我们来学习集合的第一大体系 List。

874
来自专栏封碎

BitSet位图算法 博客分类: 算法 算法IDEA

位图算法,使用bit存储数据并排序,优点是快速、占用资源少,缺点是只能对整数使用。     Java和C++中都有已经实现的的BitSet类,可以直接使用...

5334

扫码关注云+社区

领取腾讯云代金券