思路:采用递归思想,穷举即可。写法有很多种,比如从第一个数字的每一种取值,递归剩下字符串答案,拼接即可。
public List<String> letterCombinations(String digits) {
if(digits==null||digits.length()==0) return new ArrayList<>();
//设置每个数字对应字符集的头
HashMap<Character,Character> map=new HashMap<>();
map.put('2','a');
map.put('3','d');
map.put('4','g');
map.put('5','j');
map.put('6','m');
map.put('7','p');
map.put('8','t');
map.put('9','w');
List<String> answer=new ArrayList<>();
//首先求解除去第一个字符剩余字符串的解集
List<String> subAnswer=letterCombinations(digits.substring(1));
char firstChar=digits.charAt(0);
int letterNumbers=firstChar=='7'||firstChar=='9'?4:3;
//一个二重循环搞定
for(int i=0;i<letterNumbers;i++){
if(subAnswer.size()==0){
answer.add(((char)(map.get(firstChar)+i))+"");
}
else{
for(int j=0;j<subAnswer.size();j++){
answer.add(((char)(map.get(firstChar)+i))+subAnswer.get(j));
}
}
}
return answer;
}