17. LetterCombinationsOfAPhoneNumber

这题是典型的递归,不过用迭代也可以做。
迭代的思路是,
第一层for每次读入一个digits里的数字,解析成String,比如从1得到"abc"。
第二层for,依次读取结果集result里面已有的array们。
第三层for,依次读取"abc"里面的"a""b""c",跟第二层里面的结果集里的一一匹配。
最后,更新结果集。

    public ArrayList<String> letterCombinations(String digits) {
        ArrayList<String> result = new ArrayList<>();
        if(digits.length()==0) return result;
        result.add("");
        int digitLen = digits.length();
        for(int i = 0 ; i < digitLen ; i ++){
            String letter = getLetters(digits.charAt(i));
            ArrayList<String> newResult  = new ArrayList<>();
            for(int j = 0 ; j < result.size() ; j++ ){
                for(int k = 0 ; k < letter.length() ; k ++){
                    newResult.add(result.get(j) + letter.charAt(k));
                }
            }
            result = newResult;
        }
        return result;
    }

    private String getLetters(char digit) {
        switch (digit) {
            case '2':
                return "abc";
            case '3':
                return "def";
            case '4':
                return "ghi";
            case '5':
                return "jkl";
            case '6':
                return "mno";
            case '7':
                return "pqrs";
            case '8':
                return "tuv";
            case '9':
                return "wxyz";
            case '0':
                return "";
            default:
                return "";
        }
    }

递归的思路:
https://segmentfault.com/a/1190000003766442

public class Solution {

    String[] table = {" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};


    public List<String> letterCombinations(String digits) {
        // 建立映射表
        ArrayList<String> result = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        dfs(result, sb, digits, 0);
        return result;
    }

    public void dfs(ArrayList<String> result, StringBuilder sb, String digits, int tableIndex) {
        if (tableIndex == digits.length()) {
            result.add(sb.toString());
            return;
        }
        //digits: "23"
        //注意这一句,tableIndex每次递归后增加;而for中i增加的是当前letter的index,也就是说输入"12"会以ad,ae,af..顺序打印
        String letter = table[digits.charAt(tableIndex) - '0'];
        //letter.length() not  digits.length()
        for (int i = 0; i < letter.length(); i++) {
            sb.append(letter.charAt(i));
            dfs(result, sb, digits, tableIndex + 1);
            //永远是len-1
            sb.deleteCharAt(sb.length() - 1);
        }
    }

    public static void main(String args[]) {
        Solution solution = new Solution();
        System.out.println(solution.letterCombinations("23"));
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,885评论 25 709
  • 因为妹妹在追马伊琍主演的《我的前半生》,为了显示我这个当哥哥的品位比她高,所以我决定把书拿出来读一下。在微信读书上...
    胡策春秋阅读 1,232评论 8 16
  • 我曾经也和你们一样 急促地呼吸 挥汗如雨 我曾经也和你们一样 美丽的年纪 经历相同 我曾经也和你们一样 因忙碌而充...
    落日不晚阅读 158评论 0 0
  • 这是我的初恋故事… 记得,她小的时候,在家人的聊天与谈话中偶尔会听人提起一个男生,说男生的家庭琐事,说男生的身体不...
    小嫌弃阅读 608评论 1 2