思路:
dfs这种题懂的都懂,不懂的讲了也不懂。
听哥一句劝,先去把这个专题搞明白吧。这个资料也是我写的https://download.csdn.net/download/u011403239/12045003?spm=1001.2014.3001.5503
初学者不易理解,老玩家又觉得简单,重点是这东西没法讲。建议找个草稿纸画一画归并排序与二叉树dfs的过程。
代码如下:
class Solution {
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) return new ArrayList<>();
char[] chars = digits.toCharArray();
Map<Character,List<Character>> map = new HashMap<>(8);
map.put('2',new ArrayList<Character>(){{add('a');add('b');add('c');}});
map.put('3',new ArrayList<Character>(){{add('d');add('e');add('f');}});
map.put('4',new ArrayList<Character>(){{add('g');add('h');add('i');}});
map.put('5',new ArrayList<Character>(){{add('j');add('k');add('l');}});
map.put('6',new ArrayList<Character>(){{add('m');add('n');add('o');}});
map.put('7',new ArrayList<Character>(){{add('p');add('q');add('r');add('s');}});
map.put('8',new ArrayList<Character>(){{add('t');add('u');add('v');}});
map.put('9',new ArrayList<Character>(){{add('w');add('x');add('y');add('z');}});
StringBuilder sb = new StringBuilder();
List<String> resList = new ArrayList<>();
dfs(0,chars,map,sb,resList);
return resList;
}
/**
*
* @param deep 递归深度
* @param chars digits.toCharArray();
* @param map 按键与对应字母的映射
* @param sb 用于动态添加字符。是很重要的参数
* @param resList 返回的结果集合
*/
public void dfs(int deep,char[] chars,Map<Character,List<Character>> map,StringBuilder sb,List<String> resList) {
if(deep == chars.length) {
resList.add(sb.toString());
return;
}
List<Character> characterList = map.get(chars[deep]);
for(int i=0;i<characterList.size();i++) {
// 前序
sb.append(characterList.get(i));
// 递归到下一层
dfs(deep+1,chars,map,sb,resList);
// 后序,这些不理解可以找个草稿纸画一画,或者先理解下归并排序
sb.deleteCharAt(sb.length()-1);
}
}
}