LeetCode 17 电话号码的字母组合

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;
    }
}
posted @ 2020-08-26 08:52  CodeSPA  阅读(155)  评论(0编辑  收藏  举报