文章目录
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’] 的一个数字。
解题
方法:回溯
先用哈希表建立数字与字符的对应关系
然后遍历digits中每个字符对应的数字,找到对应的字符,在进行下一个数字(穷举)深度优先遍历
当往上返回时,注意删除已经添加的字符串
时间复杂度:O(3^ m×4^ n)
空间复杂度:O(m+n)
class Solution {
public List<String> letterCombinations(String digits) {
// 初始化结果
List<String> result = new ArrayList<String>();
if(digits.length() == 0) {
return result;
}
// 初始化哈希对应关系
Map<Character, String> map = 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(result, digits, map, 0, new StringBuffer());
return result;
}
// 深度优先遍历,穷举,回溯
// 找到每个数字对应的字符串,然后对这个字符串再遍历
private void backtrack(List<String> result, String digits, Map<Character, String> map,
int index, StringBuffer buffer) {
if (index == digits.length()) {
// 数字字符串遍历完了
result.add(buffer.toString());
return;
} else {
// 当前的数字
char digit = digits.charAt(index);
// 获取数字对应的字符串
String str = map.get(digit);
// 穷举,遍历字符串
for (int i = 0; i < str.length(); i++) {
// 添加第一个字符
buffer.append(str.charAt(i));
// 进入第二个数字
backtrack(result, digits, map, index+1, buffer);
// 这行是清空缓冲区的作用,删除此序列中指定位置的字符
buffer.deleteCharAt(index);
}
}
}
}