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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)