题目链接:电话号码的字母组合
题目描述:
暴力方法
模拟,将题目里面给的数据存到map里面,用一个list储存结果集,每个数字匹配之前都将前一次结果集中结果获取到string[]数组中,再将list清空储存新的结果集
class Solution {
public List<String> letterCombinations(String digits) {
if(digits.length()<=0||digits==null||digits==""){
return new ArrayList<String>();
}
Map<Character,char[]> map=new HashMap<>();
List<String> list=new ArrayList<>();
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'});
char[] chars=null;
if(digits.length()>0||digits!=null||digits!=""){
chars = map.get(digits.charAt(0));
}
for (int i = 0; i < chars.length; i++) {
list.add(String.valueOf(chars[i]));
}
//遍历每一个数字
for (int i = 1; i < digits.length(); i++) {
char[] charss = map.get(digits.charAt(i));
String[] strings=list.toArray(String[]::new);
list.clear();
//遍历现有结果集
for (int k = 0; k < strings.length; k++) {
//将新的数字对应的数据拼接到结果集
for (int l = 0; l < charss.length; l++) {
//将新拼接的结果集添加进去
list.add(strings[k]+charss[l]);
}
}
}
return list;
}
}
dfs方法
还是将所有匹配的键值对存到map里面,以第一个数字对应的字符数组为起点进行深度搜索s代表当前阶段拼好的串,index代表深度即搜到了第几层,顺序如图1234的顺序,逐层进行搜索
public static List<String> letterCombinations(String digits) {
if(digits.length()<=0||digits==null||digits==""){
return new ArrayList<String>();
}
Map<Character,char[]> map=new HashMap<>();
List<String> list=new ArrayList<>();
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'});
char[] chars = map.get(digits.charAt(0));
for (int i = 0; i < chars.length; i++) {
dfs(String.valueOf(chars[i]),1,digits,map,list);
}
return list;
}
/*
* dfs函数
* s:代表拼接过程串,逐层向s拼接新的字符
* index:深度搜索到了第几层
* digits:数字串用来获取当前数字代表的字符集
* map:用来返回数字代表的字符集
* list:用来储存结果
* */
public static void dfs(String s,int index,String digits,Map<Character,char[]> map,List<String> list){
//如果深度大于等于最大深度则将结果集加入返回上一层(回溯)
if(index>=digits.length()){
list.add(s);
return;
}
//获取当前层的字符集
char[] chars= map.get(digits.charAt(index));
for (int i = 0; i < chars.length; i++) {
dfs(s+String.valueOf(chars[i]),index+1,digits,map,list);
}
return ;
}