• leetcode 17. Letter Combinations of a Phone Number


    题目内容

    Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
    
    A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
    
    

    Example:
    Input: "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
    
    

    分析过程

    • 题目归类:
      递归
    • 题目分析:
      观察到这种题目都是与第二个数加到一起,所以可用递归来进行,递归中用for来遍历所有的情况,然后每种情况先将字符加到string中,然后进行递归(去除一位),在递归结束后,string删除该位。
      推出条件当String 的长度为1时,加入到StringList中。
    • 边界分析:
      • 空值分析
      • 循环边界分析
    • 方法分析:
      • 数据结构分析
      • 状态机
      • 状态转移方程
      • 最优解
    • 测试用例构建

    代码实现

    class Solution {
        List<String> list = new ArrayList<>();
        String string = new String();
        public List<String> letterCombinations(String digits) {
            if(digits==null||digits.length()==0)
                return list;
            int l = digits.length();
            char ch = digits.charAt(0);
            if(l==1){
                switch(ch){
                    case '2':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'a');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                           
                       }
                       return list;
                  
                    case '3':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'d');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '4':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'g');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '5':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'j');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                     
                    case '6':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'m');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                      
                    case '7':
                       for(int i = 0; i <4;i++){
                           string +=  (char)(i+'p');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                     
                    case '8':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'t');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '9':
                       for(int i = 0; i <4;i++){
                           string +=  (char)(i+'w');
                           list.add(new String(string));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                        
               }
            }
            switch(ch){
                    case '2':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'a');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '3':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'d');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '4':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'g');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '5':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'j');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '6':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'m');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                      
                    case '7':
                       for(int i = 0; i <4;i++){
                           string +=  (char)(i+'p');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '8':
                       for(int i = 0; i <3;i++){
                           string +=  (char)(i+'t');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;
                       
                    case '9':
                       for(int i = 0; i <4;i++){
                           string +=  (char)(i+'w');
                           letterCombinations(digits.substring(1,digits.length()));
                           string=string.substring(0,string.length()-1);
                       }
                       return list;    
               }
            return list;
            
        }
    }
    

    效率提高

    虽然很快做出来了,但是效率不高,效率高的做法是:
    看了别人的做法,方法是一样的,但是可以将数据直接保存到static String[] MAP = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    ,然后用 for (char c : MAP[digits.charAt(index) - '0'].toCharArray())来获得。

    
    

    拓展问题

  • 相关阅读:
    第2章 创建基础框架
    目录
    工厂方法模式(Factory Method)
    petshop4.0 详解之七(PetShop表示层设计)
    第1章 启动电子商务网站
    第3章 创建商品目录:第Ⅰ部分
    编写一个JAVA应用程序,用户从键盘只能输入整数,程序输出这些整数的乘积
    书上例题练习第一章
    java与C/C++的区别
    安装JDK遇到的问题
  • 原文地址:https://www.cnblogs.com/clnsx/p/12331894.html
Copyright © 2020-2023  润新知