题目:
思路:
参考: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}}
}