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

dfs搜索

原题链接

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

在这里插入图片描述

代码案例:输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
输入:digits = “”
输出:[]
输入:digits = “2”
输出:[“a”,“b”,“c”]

题解

枚举

1、先把数字和字符对应在一个哈希表中
2、dfs(String digits,int u,String path):path表示当前已经有什么元素,u表示枚举到digitis的第u个字母,从哈希表中找到第u个字母对应的几个字符,分别进行枚举拼接到path后面
一个数字最多有4种情况,假设有n个数字,因此4n4n种情况是一个上限,因此时间复杂度是O(4n)

这里面clear()的理解:list.clear()与list = null 区别
java中list集合通过clear()方法清空,只会将list中的对象变成垃圾回收清空,但是list对象还是存在
但是通过list=null后,不仅列表中的对象变成了垃圾,为列表分配的空间也会回收,什么都不做与赋值NULL一样,
说明直到程序结束也用不上列表list了,它自然就成为垃圾了.clear()只是清除了对象的引用,使那些对象成为垃圾

如果没有clear()的话 相当于复制Null 这个时候digits的length为0 所以返回就会出错 因为Null 是地址不在 “” 这个是地址在 但是内容为0

1、递归写法

 class Solution {
    static HashMap<String,String> map = new HashMap<>(){
        {
            put("2", "abc");
            put("3", "def");
            put("4", "ghi");
            put("5", "jkl");
            put("6", "mno");
            put("7", "pqrs");
            put("8", "tuv");
            put("9", "wxyz");
        }
    };
    static List<String> ans = new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        ans.clear();
        if(digits.length() == 0) return ans;
        dfs(digits,0,"");
        return ans;
    }
   static void dfs(String digits,int u ,String path){
        if(u == digits.length() ){
            ans.add(path);
            return;
        }
        String t = map.get(digits.substring(u,u+1));//查询digits里面数字所代表的字符集
        for(int i = 0;i < t.length();i ++)//循环字符集
        {
            dfs(digits,u + 1,path + t.charAt(i));//dfs下一个
        }
    }           
}

2、迭代写法

class Solution {
    static HashMap<String,String> map = new HashMap<String,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 digits) {
        List<String> ans = new ArrayList<String>();
        int n = digits.length();
        if(n == 0) return ans;
        ans.add("");
        //枚举数字
        for(int i = 0;i < n;i ++)
        {
            //存放变换后的数组
            List<String> t = new ArrayList<String>();
            String num = digits.substring(i,i + 1);
            String s = map.get(num);//数字对应的字符串
            //枚举该数字的所有字母
            for(int j = 0;j < s.length();j ++)
            {
                String e = s.substring(j,j+1);
                //遍历旧链表存放的组合,并将该字母拼接到所有组合的后面
                for(String x : ans)
                {
                  t.add(x + e);
                }     
            }
            ans = t;
        }
        return ans;
    }
}

 
posted @   依嘫  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示