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 }

浙公网安备 33010602011771号