给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le…
解题思路
类似队列的方法
- 判断传入的是不是空
- 初始化集合
- 数组数据
- 遍历,获取字符串的单个字符转换成int
- 通过刚刚获取的int,去数组的数据,下标就是int的值
- 循环取集合里的元素和循环的遍历i对比。例如传入34,第一次遍历时,获取单个字符3,取数组的数据"def",link.peek()获取的是"",长度是0
- 记录移除的""
- 分隔"def",循环加入集合,分别是"d","e","f"。
在第2次遍历的时候,在第六步获取的4,数组的数据为"ghi",再次link.peek()获取的是"d",往下走,删除并记录d,进入数据为"ghi"的循环,添加的时候,"dg","dh","di"。在次循环取的"e",和前面一样的步骤。
public List<String> letterCombinations(String digits) {
LinkedList<String> link = new LinkedList<>();
// 1
if(digits.isEmpty()) {
return link;
}
// 2
link.add("");
// 3
String[] result = {"0", "1", "abc", "def","ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
for (int i = 0; i < digits.length(); i++) {
// 4
int x = Character.getNumericValue(digits.charAt(i));
// 5
String s = result[x];
// 6
while(link.peek().length() == i) {
// 7
String e = link.remove();
// 8
for (char c : s.toCharArray()) {
// 9
link.add(e+c);
}
}
}
return link;
}