给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解题思路:设定按键与所包含字符的映射集合(Map),设定返回的List集合,利用深度优先搜索的思想,按照给出的按键顺序逐层搜索即可。在每一层中,使用for循环,以当前字符取-继续下一层dfs-当前字符不取的过程搜索,直到搜索的层数达到给定字符串的长度,停止,并将当前结果添加到List列表集合中,返回即可。
要注意给定字符串长度为0的情况,不需要dfs,直接返回空List,不可返回 :[""](报错)。
开始按照传统的传参的方式调用dfs函数,将映射Map集合通过参数传递过去。利用StringBuffer声明一个便于增减字符的变量,进行深度搜索。
class Solution {
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");
}};
List<String> ans = new ArrayList<String>() ;
public List<String> letterCombinations(String digits) {
if(digits.length()==0)
return ans;
dfs(digits,0,new StringBuffer()) ;
return ans ;
}
public void dfs(String digits,int cur,StringBuffer combination){
if(cur == digits.length()){
ans.add(combination.toString());
return ;
}
char tmp = digits.charAt(cur);
String button = map.get(tmp);
for(int x=0; x<button.length(); x++){
combination.append(button.charAt(x));
dfs(digits,cur+1,combination);
combination.deleteCharAt(cur);
}
return ;
}
}
最后试了一下将Map映射集合用String数组替代,声明在main函数外面。
但是感觉力扣的编译器有个问题,String数组作为一个类,是需要声明对象之后才可以对其操作的。
但是不可以在静态方法中直接调用非静态方法,正常来说可以在String数组前添加static关键字可以避免编译错误。不过力扣编辑器是可以直接通过的。
class Solution {
static String[] map = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> ans = new ArrayList<String>() ;
public List<String> letterCombinations(String digits) {
if(digits.length()==0)
return ans;
dfs(digits,0,new StringBuffer()) ;
return ans ;
}
public void dfs(String digits,int cur,StringBuffer combination){
if(cur == digits.length()){
ans.add(combination.toString());
return ;
}
int tmp = (int)(digits.charAt(cur)) - '0';
String button = map[tmp];
for(int x=0; x<button.length(); x++){
combination.append(button.charAt(x));
dfs(digits,cur+1,combination);
combination.deleteCharAt(cur);
}
return ;
}
}

给定一个数字字符串,根据电话键盘的映射找出所有可能的字母组合。使用深度优先搜索策略,从字符串的第一个数字开始,逐层遍历每个数字对应的字母。如果字符串为空,返回空列表。在实现过程中,尝试了Map和String数组作为字母映射,发现力扣编译器对静态方法和非静态方法的处理存在特殊性。
1570

被折叠的 条评论
为什么被折叠?



