Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
解题思路
这是一道非常经典的深搜+回溯的题,一刚开始会很难适应递归回溯的这种逻辑,但是还是要慢慢去理解,写起来还是很方便的。
我们可以先用map来存储每个数字对应的有哪些字母,然后进行回溯操作。回溯过程中维护一个res字符串表示已有的字母排列。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。细节直接看代码。
代码
class Solution {
List<String> ans = new ArrayList<>(); //存储最后答案
Map<Character, String> map = new HashMap<>(){ //保存每个数字对应的字母集合
{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}
};
public List<String> letterCombinations(String digits) {
if(digits.length() == 0) //特判
return ans;
dfs(digits, 0, ""); //从第一个数字开始遍历,并且res字符串表示已有的字母排列
return ans;
}
void dfs(String s, int i, String res) {
if(i == s.length()) { //如果遍历完字符串的长度,说明完成了一种情况
ans.add(res); //直接加入答案集合中
return;
}
String let = map.get(s.charAt(i)); //记录第i个数字可能出现的所有字母集
for(int k = 0; k < let.length(); k++) { //遍历所有字母集
res += let.charAt(k); //选当前字母
dfs(s, i + 1, res); //递归匹配后面的字母
res = res.substring(0, i); //回溯,不选当前字母
}
}
}
复杂度分析
- 时间复杂度:O(3^m × 4^n),其中
m
是输入中对应3
个字母的数字个数(包括数字2、3、4、5、6、8
),n
是输入中对应4
个字母的数字个数 - 空间复杂度:O(m + n)
以上是关于Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)的主要内容,如果未能解决你的问题,请参考以下文章