给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
知识点
递归、回溯
拿数组做哈希表
思路
这题主要考察的是回溯,这题如果用层级的视角去看dfs会容易很多,拿23举例子,画出以下图
遍历每层映射后的相关字母,然后只要没有到达最后一层就往path数组中加对应字母。路径到达底端,就有一个“回”的动作,回之前把path的东西放到结果数组ans中。“ad”这个路径“回”完事了,就又轮到“ae”这个路径,以此类推。我做递归或者回溯的思路就是,找到每一层对应初始数据和逻辑,然后通过递归函数作为之后所有数据的解决方法(可以不用想递归过程中都做了些什么)。
题解
class Solution {
private char[] arr;
private char[] path;
private String[] mapping;
private static List<String> ans;
public List<String> letterCombinations(String digits) {
// 以水平(层级)的视角去看待这个问题
// 先建一个数组用于将具体的电话号码映射为对应的字母,由题可以知道一共有10个数。
int n = digits.length();
if (n == 0){
return List.of();
}
mapping = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
arr = digits.toCharArray();
path = new char[n];
ans = new ArrayList<>();
dfs(0);
return ans;
}
private void dfs(int i){
if (i == arr.length){
ans.add(new String(path));
return;
}
for (char c:mapping[arr[i] - '0'].toCharArray()){
path[i] = c;
dfs(i+1);
}
}
}