zoukankan      html  css  js  c++  java
  • 【1】【leetcode-17】*的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

     

    示例:

    输入:"23"
    输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
    说明:
    尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number

    1.递归加回溯

    把输入字符串digits.toCharArray(),当前执行到的位置i,当前的一条结果res作为回溯方法backtrack的参数

    注意HashMap初始化方式:{{put();}}

    class Solution {
         List<String> result = new ArrayList<>();
         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");
        }};
        public List<String> letterCombinations(String digits) {
             if(digits.length() != 0)
               backtrack(digits.toCharArray(),0,"");
            return result; 
        }
         private void backtrack(char[] chars, int i, String res) {
            if(i == chars.length){//i已经完成了依次数字遍历
                result.add(res);//将该分支结果加入list
                return;
            }
            String letters = map.get(chars[i]);//获取数字对应英文组合
            for (int j = 0; j < letters.length(); j++) {
                String letter = letters.substring(j,j+1);
                backtrack(chars,i+1,res + letter);
            }
    
        }
        
    }

    我的解法:

    回溯后通过

    backTrack(digits,index+1,cur);

    cur = cur.substring(0,cur.length()-1);

    来去掉上一条路径的影响。与上面的参考解法其实是一回事,参考解法

    backtrack(chars,i+1,res + letter);

    并未修改当前这条字符串cur的值

        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> res = new LinkedList<>();
        public List<String> letterCombinations(String digits) {
            if (digits != null && digits.length() > 0) {
                backTrack(digits, 0, "");
            }
            return res;
        }
    
        public void backTrack(String digits,int index,String cur) {
            if (cur.length() == digits.length()) {
                res.add(cur);
                return;
            }
            String s = map.get(digits.toCharArray()[index]);
            for (int i=0;i<s.length();i++) {
                cur = cur + s.charAt(i);
                backTrack(digits,index+1,cur);
                cur = cur.substring(0,cur.length()-1);
            }
        }

    2.非常精巧的队列解法

    出队后加上每一种分支再入队

    public List<String> letterCombinations(String digits) {
            LinkedList<String> ans = new LinkedList<String>();
            if(digits.isEmpty()) return ans;
            String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
            ans.add("");
            for(int i =0; i<digits.length();i++){
                int x = Character.getNumericValue(digits.charAt(i));
                while(ans.peek().length()==i){
                    String t = ans.remove();
                    for(char s : mapping[x].toCharArray())
                        ans.add(t+s);
                }
            }
            return ans;
        }
  • 相关阅读:
    JSON特殊字符的处理
    java中高并发和高响应解决方法
    对redis深入理解
    对java中arraylist深入理解
    Redis的字典扩容与ConcurrentHashMap的扩容策略比较
    PHP压缩上传图片
    windows 平台 php_Imagick 拓展遇到的那些坑!
    windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)
    php使用imagick模块实现图片缩放、裁剪、压缩示例
    文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
  • 原文地址:https://www.cnblogs.com/twoheads/p/11272895.html
Copyright © 2011-2022 走看看