Day 69
题目描述
思路
采取了回溯的做法,做法如下
- 将电话号码对应的字母字符串加入map方便查找
- 进入find函数 介绍一下参数,res为结果集合,num为map表,digits为处理的数组集合,index为层数(这个后面解释),re为暂时处理的字符串
- 因为我们要的是随机组合的字母字符串,所以当长度等于digits的长度时我们才加入res
- 取出digits的字符(就是数字),从num中取出对应的字母字符串
- 进入循环,将该字母字符串中字符加入展示处理的字符串re
- 这里需要解释一下index层数,我们将digits的每个数字视为一层,比如234,2就是第一层(这里代码算的第0层),如果说取出随机组合,那么2的字符串中每一个字符都要拼上下一层的3所有字符串的字符(有点拗口 下面有个图 结合理解一下)。
- 回到代码,我们取出一个字符,就拼上下一层的字符,这样一直拼到最后一层,就是一个随机组合的结果
- 将其加入到结果集res
- 清空暂时字符串re
class Solution {
List<String>res=new ArrayList<>();
public List<String> letterCombinations(String digits) {
List<String>res=new ArrayList<String>();
if(digits.length()==0){
return res;
}
Map<Character,String>num=new HashMap<>();
num.put('2', "abc");
num.put('3', "def");
num.put('4', "ghi");
num.put('5', "jkl");
num.put('6', "mno");
num.put('7', "pqrs");
num.put('8', "tuv");
num.put('9', "wxyz");
find(res,num,digits,0,new StringBuffer());
return res;
}
public void find(List<String> res, Map<Character, String> num, String digits, int index, StringBuffer re){
if(index==digits.length()){
res.add(re.toString());
}
else{
char a=digits.charAt(index);
String m=num.get(a);
for(int i=0;i<m.length();i++){
re.append(m.charAt(i));
find(res,num,digits,index+1,re);//ad ae af
re.deleteCharAt(index);
}
}
}
}