电话号码的字母组合(17)
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。力扣第17题:电话号码的字母组合
解题思路:
从题目得到,digits的范围在2~9之间,所有我们可以不考虑0和1。示例2已经提示到字符串位可能为空,所以需要单独处理一下。当然,在题目没有明确说明的时候,我们也需要这一步。本题我们可以使用回溯法。
如23,那就是2对应abc
,3对应def
,如下图所示。剩下的三位数,四位数的做法和下图类似。
具体实现代码请看最下方代码实现
示例1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例2:
输入:digits = ""
输出:[]
示例3:
输入:digits = "2"
输出:["a","b","c"]
代码实现:
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<>();
// 空字符串处理
if (digits.length() == 0) return list;
// 手机数字键盘所示,先存储到HashMap中。
Map<Character, String> phoneNum = new HashMap<>();
phoneNum.put('2', "abc");
phoneNum.put('3', "def");
phoneNum.put('4', "ghi");
phoneNum.put('5', "jkl");
phoneNum.put('6', "mno");
phoneNum.put('7', "pqrs");
phoneNum.put('8', "tuv");
phoneNum.put('9', "wxyz");
getPhoneNumText(list, phoneNum, digits, 0, new StringBuffer());
return list;
}
public void getPhoneNumText(List<String> list, Map<Character, String> phoneNum, String digits, int index, StringBuffer s) {
if (index == digits.length()) {
list.add(s.toString()); // 当遍历结束后添加到list列表
}else {
char num = digits.charAt(index); // 获取键盘数字
String pNum = phoneNum.get(num); // 获取对应数字键盘的字母
for (int i = 0; i < pNum.length(); i++) {
s.append(pNum.charAt(i));
getPhoneNumText(list, phoneNum, digits, index + 1, s);
s.deleteCharAt(index); // 完成此操作后,删除对应值,即返回
}
}
}