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”]
class Solution {
public List<String> letterCombinations(String digits) {
//首先定义一个结果集合
List<String> res = new ArrayList<>();
//异常情况,直接返回空
if (digits == null || digits.length() == 0) {
return res;
}
//定义数字与字母的映射关系
HashMap<Integer, String> map = new HashMap<>();
map.put(2, "abc");
map.put(3, "def");
map.put(4, "ghi");
map.put(5, "jkl");
map.put(6, "mno");
map.put(7, "pqrs");
map.put(8, "tuv");
map.put(9, "wxyz");
//定义中间变量
StringBuilder builder = new StringBuilder();
//0就是指的从digits的首位数字开始组合
back(digits, map, builder, res, 0);
return res;
}
public static void back(String digits, HashMap<Integer, String> map, StringBuilder builder, List<String> res, int i) {
//当中间变量长度达到数字串的长度时
if (builder.length() == digits.length()) {
res.add(builder.toString());
return;
}
//获取到每个数字对应的字母串
String s = map.get(Integer.parseInt(String.valueOf(digits.charAt(i))));
//回溯追加
for (char c : s.toCharArray()) {
builder.append(c);
back(digits, map, builder, res, i + 1);
builder.deleteCharAt(builder.length() - 1);
}
}
}