1.问题思路
面对组合问题,采用回溯思想使用DFS遍历。首先确定递归三部曲:
① 这里需要得到所有可能结果,一般使用void。我们需要通过index来记录digits所在位置,当遍历完毕则需要添加到结果集中。
public void dfs(String digits, Integer digitIndex)
② 循环的退出条件,既当前遍历path数组的大小等于字符串的长度时,代表已到达最大深度。
③ 每层的广度优先遍历,即对应数字键的字母。
2.代码实现
class Solution {
List<String> result = new ArrayList<>(); // 存放所有可能的结果
StringBuilder sb = new StringBuilder(); // 记录dfs从头到尾的路径
// 数字对应的按键
Map<Character, String> map = new HashMap<Character, String>(){{
this.put('2', "abc");
this.put('3', "def");
this.put('4', "ghi");
this.put('5', "jkl");
this.put('6', "mno");
this.put('7', "qprs");
this.put('8', "tuv");
this.put('9', "wxyz");
}};
public List<String> letterCombinations(String digits) {
if (digits.length()==0) {
return result;
}
// map
dfs(digits, 0);
return result;
}
public void dfs(String digits, Integer digitIndex) {
// 终止条件
if (digitIndex == digits.length()) {
result.add(sb.toString());
return;
}
// 水平遍历
char item = digits.charAt(digitIndex);
String chars = map.get(item);
for (int i = 0; i < chars.length(); i++) {
sb.append(chars.charAt(i));
// 递归遍历
dfs(digits, digitIndex+1);
// 回溯
sb.deleteCharAt(digitIndex);
}
}
}