Letter Combinations of a Phone Number
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
Solution:
class Solution {
public List<String> letterCombinations(String digits) {
Map<Character, List<Character>> map = new HashMap<>();
map.put('2', Arrays.asList('a', 'b', 'c'));
map.put('3', Arrays.asList('d', 'e', 'f'));
map.put('4', Arrays.asList('g', 'h', 'i'));
map.put('5', Arrays.asList('j', 'k', 'l'));
map.put('6', Arrays.asList('m', 'n', 'o'));
map.put('7', Arrays.asList('p', 'q', 'r', 's'));
map.put('8', Arrays.asList('t', 'u', 'v'));
map.put('9', Arrays.asList('w', 'x', 'y', 'z'));
List<String> result = new ArrayList<>();
if (digits == null || digits.length() == 0) return result;
List<List<Character>> list = new ArrayList<>();
for (char c : digits.toCharArray()) {
list.add(map.get(c));
}
backtrack(result, new StringBuilder(), list);
return result;
}
private void backtrack(List<String> result, StringBuilder sb, List<List<Character>> list) {
if (sb.length() == list.size()) {
result.add(sb.toString());
return;
}
int level = sb.length();
List<Character> set = list.get(level);
for (char c : set) {
sb.append(c);
backtrack(result, sb, list);
sb.setLength(sb.length() - 1);
}
}
}