题目描述
给定一个仅包含数字 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’] 的一个数字。
思路
其实就是将其类比与树,对树进行遍历,如下图所示
思路流程:
- 将每一种数字对应的字符串使用map集合保存
- 使用递归,将数字(key)对应的字符串(value)里面的字符使用charAt()方法进行获取
- 使用StringBuffer进行拼接字符串
代码
class Solution {
public List<String> letterCombinations(String digits) {
//定义存放所求字符串的集合,用于函数返回
List<String> combinations = new ArrayList<String>();
//如果数组的长度是0,则直接返回空的集合
if(digits.length()==0){
return combinations;
}
//使用map存放2到9的字母情况
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;
}
/*
combinations:存放的所有符合要求的组合
phoneMap:2到9的所有字符情况
digits:按键情况
index:当前所在位置(比如“23”,等于0变代表当前是“2”的情况)
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{//还可以进行向下一个字符走
//获取当前位置的内容(如“23”,index=0,获取字符“2”)
char digit = digits.charAt(index);
//获取当前字符的字符串情况(如“23”,index=0时,字符为“2”,,获取的字符串为“abc”)
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);
//删除索引为index的字符
//因为现在的combination里面包含了后面的一个字符,所以需要删除
combination.deleteCharAt(index);
}
}
}
}
代码说明
看注释。。。