17.电话号码的字母组合

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
17.电话号码的字母组合_第1张图片
17.电话号码的字母组合_第2张图片

分析

该题使用递归思路,如下图例子首先遍历23,遍历到2,找到其对应的字符串abc,然后遍历abc,遍历第一个字符a,添加到自己设置的字符串combine里,然后递归下一个数字3对应的字符串def,遍历第一个字符d,再将这个字符添加到combine里,然后发现idx+1已经是达到23的长度了(递归终止添加),将combine添加到list中,返回,然后回溯回a,接着遍历到f,如此反复,具体详细见代码。
17.电话号码的字母组合_第3张图片

代码

class Solution {
    List<String> list;
     String[] s;
    public List<String> letterCombinations(String digits) {
        list= new ArrayList<>();
        if(digits.length()<=0||digits == null){
            return list;
        }
        s = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        StringBuilder combine = new StringBuilder();
        //combine代表排列组合后其中一个字符串
        dfs(digits,0,combine);
        return list;
    }
    void dfs(String digits,int idx,StringBuilder combine){
        if(idx == digits.length()){
            list.add(combine.toString());
            return;
        }
        //z代表digits中当前指向的数字对应的字符串
        String z = s[digits.charAt(idx)-'0'];
        //遍历当前字符串
        for(int i=0;i<z.length();i++){
            combine.append(z.charAt(i));
            dfs(digits,idx+1,combine);
            //最后别忘了回溯
            combine.deleteCharAt(idx);
        }
    }
}

17.电话号码的字母组合_第4张图片

你可能感兴趣的:(leetcode热门200题,深度优先,算法)