LeetCode电话号码的字母组合

680 阅读1分钟

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le…

解题思路

类似队列的方法

  1. 判断传入的是不是空
  2. 初始化集合
  3. 数组数据
  4. 遍历,获取字符串的单个字符转换成int
  5. 通过刚刚获取的int,去数组的数据,下标就是int的值
  6. 循环取集合里的元素和循环的遍历i对比。例如传入34,第一次遍历时,获取单个字符3,取数组的数据"def",link.peek()获取的是"",长度是0
  7. 记录移除的""
  8. 分隔"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;
	}