leetcde 17. 电话号码的字母组合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/liujunzxcv/article/details/96596065

在这里插入图片描述

  1. 每个数字对应多个字母,要穷尽所有的组合可能,采用多叉树的结构,每遍历一个数字,在多叉树中就多了一层,即在当前的所有叶子节点下面再加上新数字对应的所有字母,形成新的多叉叶子节点。

  2. 将多叉树建立出来之后,再通过深度优先遍历整个树,遍历的时候每到一个叶子节点,就形成了从根节点到当前叶子节点的一个解答,遍历完之后的结果集就是答案。使用一个stringbuilder维持当前的从根节点到当前节点形成得字符串

  3. 一个小细节要注意的是每次遍历完一个节点前,要把当前节点的字母加进去,遍历完之后再把当前字母从stringbuilder删掉

  static Map<Character, String> map = new HashMap<>(8);

    static StringBuilder temp;
    static List<String> result;

    static {
        map.put('2', "abc");
        map.put('3', "def");
        map.put('4', "ghi");
        map.put('5', "jkl");
        map.put('6', "mno");
        map.put('7', "pqrs");
        map.put('8', "tuv");
        map.put('9', "wxyz");
    }

    private static class Node {
        char c;
        Node[] next;

        public Node(char c) {
            this.c = c;
        }
    }

    public static List<String> letterCombinations(String digits) {
        if("".equals(digits)){
            return new ArrayList<>();
        }
        Node root = new Node('\0');
        for (int i = 0; i < digits.length(); i++) {
            buildTree(root, digits.charAt(i));
        }

        result = new ArrayList<>();
        temp = new StringBuilder();
        visit(root);
        return result;
    }

    public static void buildTree(Node root, char c) {
        if (root == null) {
            return;
        } else if (root.next != null) {
            for (int i = 0; i < root.next.length; i++) {
                buildTree(root.next[i], c);
            }
        } else {
            String temp = map.get(c);
            root.next = new Node[temp.length()];
            for (int i = 0; i < root.next.length; i++) {
                root.next[i] = new Node(temp.charAt(i));
            }
        }

    }

    public static void visit(Node root) {
        if (root.next == null) {
            result.add(temp.toString());
        } else {
            for (int i = 0; i < root.next.length; i++) {
                temp.append(root.next[i].c);
                visit(root.next[i]);
                temp.deleteCharAt(temp.length() - 1);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/liujunzxcv/article/details/96596065