思路
- 使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作,穷举所有可能。
- 使用队列,类似广度优先。
代码实现
1. 回溯
class Solution {
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList<String>();
if (digits.length() == 0) {
return combinations;
}
Map<Character, String> phoneMap = new HashMap<Character, String>() {{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
return combinations;
}
public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {
if (index == digits.length()) {
//如果index扫描到最后一个数字(给定输入串digits的最后一个字符,则添加当前结果)
combinations.add(combination.toString());
} else {
char digit = digits.charAt(index);
//获取当前数字对应的字符序列
String letters = phoneMap.get(digit);
int lettersCount = letters.length();
//遍历字符序列,每种情况进行尝试,递归,回溯
for (int i = 0; i < lettersCount; i++) {
combination.append(letters.charAt(i));
backtrack(combinations, phoneMap, digits, index + 1, combination);
combination.deleteCharAt(index);
}
}
}
}
2. 队列
import java.util.*;
class Solution {
public static void main(String[] args) {
new Solution().letterCombinations("23");
}
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
if (digits == null || digits.length() == 0){
return ans;
}
Map<Character, String> map = new HashMap<Character, String>() {{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
Queue<StringBuilder> queue = new ArrayDeque<>();
int index = 0;
while (index < digits.length()){
if (queue.isEmpty()){
for (Character character : map.get(digits.charAt(index)).toCharArray()) {
queue.add(new StringBuilder().append(character));
}
index++;
continue;
}
int size = queue.size();
for (int i = 0; i < size; i++) {
StringBuilder temp = queue.poll();
for (Character character : map.get(digits.charAt(index)).toCharArray()) {
queue.add(new StringBuilder().append(temp).append(character));
}
}
index++;
}
for (StringBuilder s : queue) {
ans.add(s.toString());
}
return ans;
}
}