题目链接
leetcode在线oj题——电话号码的字母组合
题目描述
给定一个仅包含数字 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’] 的一个数字。
解题思路
首先将电话键盘上的按键数和对应的字母用HashMap存储起来
使用深度优先搜索的思想
定义一个List< String > 类型的result,用来存储结果
定义DFS方法,参数分别为digits,result,和当前阶段形成的curStr,当前遍历到的下标digitIndex,和hashmap
当当前位置下标digitIndex,和digits的长度相等,说明已经遍历到了最后一个位置,那么就在result中添加curStr
用数字从hashmap中取出对应的字符串,遍历这个字符串的每个位置
DFS再次递归,传入curstr加对应位置的字符(方便回溯),digitIndex + 1(方便回溯)
最终返回result即可
代码
class Solution {
public void DFS(String digits, List<String> result, String curStr,
int digitIndex, HashMap<Character, String> hashMap){
if(digitIndex == digits.length()){
result.add(curStr);
return;
}
//获取数字对应的字符集
String strMap = hashMap.get(digits.charAt(digitIndex));
for (int i = 0; i < strMap.length(); i++) {
char ch = strMap.charAt(i);
DFS(digits, result, curStr + ch, digitIndex + 1, hashMap);
}
}
public List<String> letterCombinations(String digits) {
HashMap<Character, String> hashMap = new HashMap<>();
hashMap.put('2', "abc");
hashMap.put('3', "def");
hashMap.put('4', "ghi");
hashMap.put('5', "jkl");
hashMap.put('6', "mno");
hashMap.put('7', "pqrs");
hashMap.put('8', "tuv");
hashMap.put('9', "wxyz");
List<String> result = new ArrayList<>();
if(digits.length() == 0){
return result;
}
DFS(digits, result, "", 0, hashMap);
return result;
}
}