leetcde 17. 電話號碼的字母組合

在這裏插入圖片描述

  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);
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章