-
每个数字对应多个字母,要穷尽所有的组合可能,采用多叉树的结构,每遍历一个数字,在多叉树中就多了一层,即在当前的所有叶子节点下面再加上新数字对应的所有字母,形成新的多叉叶子节点。
-
将多叉树建立出来之后,再通过深度优先遍历整个树,遍历的时候每到一个叶子节点,就形成了从根节点到当前叶子节点的一个解答,遍历完之后的结果集就是答案。使用一个stringbuilder维持当前的从根节点到当前节点形成得字符串
-
一个小细节要注意的是每次遍历完一个节点前,要把当前节点的字母加进去,遍历完之后再把当前字母从stringbuilder删掉
static Map<Character, String> map = new HashMap<>(8);
static StringBuilder temp;
static List<String> result;
static {
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");
}
private static class Node {
char c;
Node[] next;
public Node(char c) {
this.c = c;
}
}
public static List<String> letterCombinations(String digits) {
if("".equals(digits)){
return new ArrayList<>();
}
Node root = new Node('\0');
for (int i = 0; i < digits.length(); i++) {
buildTree(root, digits.charAt(i));
}
result = new ArrayList<>();
temp = new StringBuilder();
visit(root);
return result;
}
public static void buildTree(Node root, char c) {
if (root == null) {
return;
} else if (root.next != null) {
for (int i = 0; i < root.next.length; i++) {
buildTree(root.next[i], c);
}
} else {
String temp = map.get(c);
root.next = new Node[temp.length()];
for (int i = 0; i < root.next.length; i++) {
root.next[i] = new Node(temp.charAt(i));
}
}
}
public static void visit(Node root) {
if (root.next == null) {
result.add(temp.toString());
} else {
for (int i = 0; i < root.next.length; i++) {
temp.append(root.next[i].c);
visit(root.next[i]);
temp.deleteCharAt(temp.length() - 1);
}
}
}