phone keypad combination

给一个phone pad mapping like: {1,{‘A’,'B' , 'C'}}, {2,   { 'D' , 'E' , 'F' }} ... {0, {'X', 'Y', 'Z'}}. 按一次1 返回A,连续两次返回B, 连续四次重新返回A. 输入一组数字,不清楚之间间隔,返回所有可能的字符串数组。

例如:

11 -> "AA", "B"

1112 -> "AAAD", "ABD", 'BAD', 'CD'.

分析:

假如输入的值是 1112,那么前面的111是不是有很多种组合? 比如 1 112, 11 12, 111 2. 但是如果数字没有重复,这里就只有一种组合,比如12,它只能是AD. 

如果我们定义一个helper method叫做 combination, 它的作用就是只要传入一个数字串,比如 1112, 它就返回对应的字母combination。 

那么,怎么实现它呢?

我们依次遍历input里面的数字,如果当前数字是input第一个数字,我们拿到该数字对应的字母,比如A,并且把剩余数字传入combination method,得到剩余数字的letter combination, 然后把A放在每个letter combination的前面。这是一种情况。

如果当前数字和前一个数字也一样,表明我们可以得到另一个不同的字母,比如B, 同样,把剩余数字传入combination method,得到剩余数字的letter combination, 然后把B放在每个letter combination的前面。这是另一种情况。

如果当前数字和前一个数字不一样,那么我们退出recursion就可以了。为何呢?比如输入的数字是11122334, 我们现在来到第一个2,第一个2的前面数字是1。我们就不用再做recursion了,因为之前的recursion已经把后面部分,即22334所有可能的combination取过了,所有的combination已经和之前“111”所有的combination已经join过了。这是这题需要思考的地方。

 1 class Solution {
 2 
 3     public static void main(String[] args) {
 4         Solution s = new Solution();
 5         Map<Integer, List<String>> mapping = new HashMap<>();
 6         mapping.put(1, Arrays.asList(new String[] { "A", "B", "C" }));
 7         mapping.put(2, Arrays.asList(new String[] { "D", "E", "F" }));
 8         String input = "11122";
 9         System.out.println(s.combination(input, mapping));
10     }
11 
12     List<String> combination(String input, Map<Integer, List<String>> mapping) {
13         List<String> all = new LinkedList<>();
14         if (input.isEmpty()) {
15             return all;
16         }
17 
18         for (int i = 0; i < input.length(); i++) {
19             if (i == 0 || input.charAt(i) == input.charAt(i - 1)) {
20                 String sameDigitPart = input.substring(0, i + 1);
21                 String letter = mapping.get(Integer.parseInt(input.substring(0, 1)))
22                         .get((sameDigitPart.length() - 1) % 3);
23                 List<String> remainingPartCombination = combination(input.substring(i + 1), mapping);
24                 if (remainingPartCombination.isEmpty()) {
25                     all.add(letter);
26                     return all;
27                 }
28                 for (String letters : remainingPartCombination) {
29                     all.add(letter + letters);
30                 }
31             } else {
32                 return all;
33             }
34         }
35         return all;
36     }
37 }

 

posted @ 2021-03-05 00:56  北叶青藤  阅读(91)  评论(0)    收藏  举报