LeetCode 17. 电话号码的字母组合
原题链接
中等
作者:
LangB
,
2020-10-28 14:50:51
,
所有人可见
,
阅读 287
回溯
class Solution {
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
// 处理边界情况
if (digits == null || digits.length() == 0) {
return res;
}
// 创建一个数字到字符串的映射
String[] strs = {" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
// dfs回溯查找
dfs(res, strs, digits, 0, new StringBuilder());
return res;
}
private void dfs(List<String> res, String[] strs, String digits, int index, StringBuilder path) {
// 如果当前path的长度等于数字长度,则加入res中,并进行回溯
if (index == digits.length()) {
res.add(path.toString());
return;
}
int digit = digits.charAt(index) - '0';
String letters = strs[digit];
int lettersLength = letters.length();
for (int i = 0; i < lettersLength; i++) {
path.append(letters.charAt(i));
// dfs进入下一个节点
dfs(res, strs, digits, index + 1, path);
path.deleteCharAt(index);
}
}
}
- 时间复杂度 O(3^m * 4^n),其中m为输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9)
- 空间复杂度 O(m + n),取决于递归调用的层数