九键键盘一串数字组成的字母字符串集合
回溯
二叉树画图表示
题目
输入:“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
));
backtrack(list
, phoneMap
, digits
, index
+ 1, str
);
str
.deleteCharAt(index
);
}
}
}
}
为何使用StringBuffer
线程安全且可变,String不可变
回溯其实也是dfs 回溯有一个重要步骤是剪枝,这里不必剪枝