九键键盘一串数字组成的字母字符串集合
回溯
二叉树画图表示
题目
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]
注意 1 不对应任何字母
画图解析
代码(非标准输入输出)
class Solution {
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<String>();
if (digits.length() == 0) { //第一判断条件
return list;
}
Map<Character, String> phoneMap = new HashMap<Character, String>() {{ //多个数据存入
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
backtrack(list, phoneMap, digits, 0, new StringBuffer()); //回溯
return list;
}
public void backtrack(List<String> list, Map<Character, String> phoneMap, String digits, int index, StringBuffer str) {
if (index == digits.length()) { //遍历结束
list.add(str.toString());
} else {
char digit = digits.charAt(index);
String letters = phoneMap.get(digit);
int lettersCount = letters.length();
for (int i = 0; i < lettersCount; i++) { //这里循环的是第一个数字对应的各个字母
str.append(letters.charAt(i));//选中第一个数字对应的第i个字母
backtrack(list, phoneMap, digits, index + 1, str);
//走到下一个数字(这里是对数字的遍历
str.deleteCharAt(index);
//回退恢复进行下一种情况
}
}
}
}
为何使用StringBuffer
线程安全且可变,String不可变
回溯其实也是dfs
回溯有一个重要步骤是剪枝,这里不必剪枝