leetcode- 电话号码的字母组合(dfs)

给定一个仅包含数字 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 ;
    }
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页