思路
DFS + 回溯, 关键在于每一层(每一位数字)的供选值是不一样的。
class Solution {
int dLength = 0;
List<String> res = new ArrayList<>();
StringBuffer path = new StringBuffer();//用SB优化
Map<Character, String> map = new HashMap<>();
public List<String> letterCombinations(String digits) {
if (digits.length() == 0) {
return res;
}
map.put('2', "abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");
dLength = digits.length();
backtrack(0, digits.toCharArray());
return res;
}
//layer指的是digits中的第几位数字;digits指的是输入的数字(把它转化成array了)
public void backtrack(int layer, char[] digits) {
if (path.length() == dLength) {
res.add(path.toString());//用SB优化//这里就不用new了,不是引用
return;
}
for (int i = 0; i < map.get(digits[layer]).length(); i++) {
path.append(map.get(digits[layer]).charAt(i));//用SB优化
backtrack(layer + 1, digits);
path.deleteCharAt(path.length() - 1);//用SB优化
}
}
}