给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
关键字:树
1、初始化一个数据为“”的节点作为根节点(root节点),然后将每个数字对应的,每一个字符创建为一个新的节点,放在同一个父节点下,并且要循环执行父节点层节点数次(如:父节点层有3个节点,那么要循环执行3次,每个节点下都有相同的节点)。
2、遍历树,根节点到叶节点的节点数据为一个组合方式
public class Test {
private Node root = new Node("");
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return result;
}
char[] chars = digits.toCharArray();
List<List<String>> lists = new ArrayList<>();
for (char c : chars) {
lists.add(char2String(c));
}
//生成树
tree(root, lists, 0);
return ergodicTree(root);
}
//用于临时存储路径
private StringBuilder sb = new StringBuilder();
private List<String> res = new ArrayList<>();
/**
* 遍历树
*
* @param tree
* @return
*/
private List<String> ergodicTree(Node tree) {
getCode(tree, tree.c, sb);
return res;
}
private void getCode(Node node, String str, StringBuilder sb) {
StringBuilder stringBuilder = new StringBuilder(sb);
stringBuilder.append(str);
if (node.nodes.size() > 0) {
for (Node n : node.nodes) {
getCode(n, n.c, stringBuilder);
}
} else {
res.add(stringBuilder.toString());
}
}
private void tree(Node node, List<List<String>> lls, int index) {
List<String> cl = lls.get(index);
for (String c : cl) {
node.nodes.add(new Node(c));
}
index++;
if (index < lls.size()) {
for (Node n : node.nodes) {
tree(n, lls, index);
}
}
}
private static List<String> char2String(char c) {
List<String> characters = null;
switch (c) {
case '1':
characters = Arrays.asList("");
break;
case '2':
characters = Arrays.asList("a", "b", "c");
break;
case '3':
characters = Arrays.asList("d", "e", "f");
break;
case '4':
characters = Arrays.asList("g", "h", "i");
break;
case '5':
characters = Arrays.asList("j", "k", "l");
break;
case '6':
characters = Arrays.asList("m", "n", "o");
break;
case '7':
characters = Arrays.asList("p", "q", "r", "s");
break;
case '8':
characters = Arrays.asList("t", "u", "v");
break;
case '9':
characters = Arrays.asList("w", "x", "y", "z");
break;
}
return characters;
}
private class Node {
String c;
List<Node> nodes;
public Node(String c) {
this.c = c;
nodes = new ArrayList<>();
}
}
}