-
每個數字對應多個字母,要窮盡所有的組合可能,採用多叉樹的結構,每遍歷一個數字,在多叉樹中就多了一層,即在當前的所有葉子節點下面再加上新數字對應的所有字母,形成新的多叉葉子節點。
-
將多叉樹建立出來之後,再通過深度優先遍歷整個樹,遍歷的時候每到一個葉子節點,就形成了從根節點到當前葉子節點的一個解答,遍歷完之後的結果集就是答案。使用一個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);
}
}
}