首页 > 其他 > 详细

LeetCode 17 电话号码的字母组合

时间:2020-08-26 11:00:00      阅读:66      评论:0      收藏:0      [点我收藏+]

Leetcode 17 电话号码的字母组合

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

  • 2: "abc"
  • 3: "def"
  • 4: "ghi"
  • 5: "jkl"
  • 6: "mno"
  • 7: "pqrs"
  • 8: "tuv"
  • 9: "wxyz"

回溯

执行用时:1 ms, 在所有 Java 提交中击败了88.95%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了69.50%的用户

/**思路:
 * 使用DFS进行搜索,复杂度O(3^N),N<=8
 * */
class Solution {
    public List<String> letterCombinations(String digits) {
        if(digits==null || digits.length()==0) return new ArrayList<String>();

        /*优化步骤:获取各数字对应的字母*/
        String[] num2char = new String[]{
                "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
        };
        /*开始搜索所有可能的组合,使用DFS*/
        List<String> ans = new ArrayList<String>();
        StringBuffer tmp = new StringBuffer();

        dfs_rec(digits, 0, num2char, tmp, ans);

        /*返回结果*/
        return ans;
    }
    /*递归DFS遍历*/
    public void dfs_rec(String digits, int start, String[] num2char, StringBuffer tmp, List<String> ans){
        /*递归终止*/
        if(start == digits.length()){
            /*添加结果到集合*/
            ans.add(new String(tmp.toString()));
            return;
        }

        /*递归过程*/
        String charsAtNum = num2char[
                //digits.charAt(start)-‘2‘
                Integer.parseInt(digits.substring(start, start+1))-2
            ];
        /*回溯*/
        for(int i=0; i<charsAtNum.length(); i++){
            tmp.append(charsAtNum.substring(i,i+1));
            dfs_rec(digits, start+1, num2char, tmp, ans);
            tmp.delete(start, start+1);
        }

        /*返回*/
        return;
    }
}

LeetCode 17 电话号码的字母组合

原文:https://www.cnblogs.com/CodeSPA/p/13563106.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!