题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
求解思路
这位大佬的视频我认为是讲的比较清晰的:
力扣【忍者算法】认准忍者算法!!!https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solution/ren-zhe-suan-fa-ren-zhun-ren-zhe-suan-fa-4krw/具体流程见代码注释,对于没有接触过dfs和回溯的人来说多看几遍就差不多能理解。
输入输出示例
代码
class Solution {
//建立全局变量字符串数组,分别对应每个数字所对应的字符串,01没有所以给空字符串
String[] map ={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//列表用于存放最后的结果
List<String> pathList = new ArrayList<>();
public List<String> letterCombinations(String digits) {
//判断数字为空或者长度为0,返回空列表
if(digits == null || digits.length() == 0) return pathList;
//深度优先遍历,传入的两个参数都是字符串
dfs(new StringBuilder(),digits);
return pathList;//最后返回结果
}
private void dfs(StringBuilder path, String digits){
//终止迭代的条件,有几个数组合的字母数就有几个,当两者相等说明全部遍历完
if(path.length() == digits.length()){
pathList.add(path.toString());//StringBuilder要转为String才能add
return;
}
//找到当前遍历的数字,字符相减是整形数字
int digitNum = digits.charAt(path.length()) - '0';
//找到当前数字所对应的字母字符串
String currentLetter = map[digitNum];
//遍历这个字符串
for(char c : currentLetter.toCharArray()){
path.append(c);//将当前字母加入
dfs(path,digits);//进一步搜索后面的
path.deleteCharAt(path.length() - 1);//将当前节点剔除,返回上一级
}
}
}