题目:
思路:
参考:https://blog.csdn.net/weixin_46429290/article/details/121888154
和上一个题《子集》的思路一样,先画出树结构,看树的深度(遍历层级),树的宽度(横向节点)分别是什么,然后套用模板,这题自然成型。
代码:
private List<String> result = new ArrayList<>();
private StringBuilder path = new StringBuilder();
private Map<Character, String> phoneMap = new HashMap<>() {{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
// 思考递归参数
// 思考递归终止条件
// 思考递归函数
public List<String> letterCombinations(String digits) {
if (digits.length() == 0) {
return result;
}
backTracking(digits, 0);
return result;
}
public void backTracking(String digits, int startIndex) {
if (startIndex == digits.length()) {
result.add(path.toString());
} else { // 注意,只有没遍历到树的最后一层,才需要递归的遍历;
String str = phoneMap.get(digits.charAt(startIndex));
for (int i = 0; i < str.length(); i++) { // 注意这里的起始点为0,横向遍历为abc,每个元素
path.append(str.charAt(i));
backTracking(digits, startIndex + 1);
path.deleteCharAt(startIndex); // 这里要回溯的树的深度,深度为startIndex
}
}
}