LeetCode_17.电话号码的字母组合
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例 2:
输入:digits = "" 输出:[]示例 3:
输入:digits = "2" 输出:["a","b","c"]提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
回溯法 较难 官方解题答案
/**
* 回溯法
*
* @param digits
* @return
*/
public List<String> letterCombinations(String digits) {
//排除空串输入
if (digits.length() == 0) {
return new ArrayList<String>();
}
//哈希表存储手机字母
Map<Character, String> phoneMap = new HashMap<>();
phoneMap.put('2', "abc");
phoneMap.put('3', "def");
phoneMap.put('4', "ghi");
phoneMap.put('5', "jkl");
phoneMap.put('6', "mno");
phoneMap.put('7', "pqrs");
phoneMap.put('8', "tuv");
phoneMap.put('9', "wxyz");
List<String> combinations = new ArrayList<String>();
backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
return combinations;
}
/**
* 辅助函数
*
* @param combinations 最终返回的列表
* @param phoneMap 手机字符哈希表
* @param digits 输入的字符串
* @param index 当前遍历到的字符下标
* @param combination 字符串
*/
public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {
if (index == digits.length()) {
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);
}
}
}
逻辑处理 + 流处理
public List<String> letterCombinations3(String digits) {
List<String> combinations = new ArrayList<>();
// 处理空输入的情况
if (digits.isEmpty()) {
return combinations;
}
// 数字到字母映射表
Map<Character, List<String>> digitToLettersMap = createDigitToLettersMapping();
// 获取第一个数字对应的字母集合
combinations.addAll(digitToLettersMap.get(digits.charAt(0)));
// 如果只有一个数字,则直接返回结果
if (digits.length() == 1) {
return combinations;
}
// 遍历剩余的每个数字,构建组合
int i = 1;
while (i < digits.length()) {
char currentDigit = digits.charAt(i);
List<String> currentLetters = digitToLettersMap.get(currentDigit);
// 创建临时存储当前轮次的新组合
List<String> newCombinations = new ArrayList<>();
//遍历
combinations.forEach(combination -> {
//遍历当前字符
List<String> temp = currentLetters.stream().map(item -> {
//将combinations的每一个字符与当前字符集合相组合
return combination + item;
}).collect(Collectors.toList());
//遍历组合完的字符串
temp.forEach(item -> {
newCombinations.add(item);
});
});
// 更新结果集为新组合
combinations = newCombinations;
i++;
}
return combinations;
}
private Map<Character, List<String>> createDigitToLettersMapping() {
Map<Character, List<String>> 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"));
return map;
}
原文地址:https://blog.csdn.net/weixin_60205306/article/details/145125528
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!