数字だけ2-9を含む文字列を考えると、それは組み合わせが示されているすべての文字を返すことができます。(同じ電話キー)、次のように文字にデジタルマップを考えます。。。。

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/LPL0129/article/details/96201985

数字だけ2-9を含む文字列を考えると、それは組み合わせが示されているすべての文字を返すことができます。

(同じ電話キー)、次のように文字にデジタルマップを考えます。注1は任意のアルファベットに対応していません。

例:

输入: "23"
输出:[ "広告"、 "AE"、 "AF"、 "BD"、 "あること"、 "BF"、 "CD"、 "CE"、 "CF"]。

説明:
上記の回答は辞書に従った順序で配置されているが、あなたが答え出力の順序を選択することができますが。

出典:ボタン(LeetCode)滞在
//leetcode-cn.com/problems/letter-combinations-of-a-phone-numberます。https:リンクを
すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。

 

キーワード:ツリー

1、ルートノード(ルートノード)として「」に初期化されたデータは、その後、新しいノードを作成するために、各文字に対応する番号が、同じ親に存在し、親ノードがループを実行しますノードいくつかの層(例えば、親層3つのノードは、次に、3サイクルを実行するために、各ノードは、同じノードを有しています)。

図2に示すように、ノードデータは、リーフノードの組み合わせにツリー、ルートノードを横切ります

 

 

 

public class Test {

    private Node root = new Node("");

    public List<String> letterCombinations(String digits) {
        List<String> result = new ArrayList<>();

        if (digits == null || digits.length() == 0) {
            return result;
        }

        char[] chars = digits.toCharArray();
        List<List<String>> lists = new ArrayList<>();
        for (char c : chars) {
            lists.add(char2String(c));
        }


        //生成树
        tree(root, lists, 0);

        return ergodicTree(root);
    }

    //用于临时存储路径
    private StringBuilder sb = new StringBuilder();
    private List<String> res = new ArrayList<>();

    /**
     * 遍历树
     *
     * @param tree
     * @return
     */
    private List<String> ergodicTree(Node tree) {

        getCode(tree, tree.c, sb);
        return res;
    }

    private void getCode(Node node, String str, StringBuilder sb) {

        StringBuilder stringBuilder = new StringBuilder(sb);
        stringBuilder.append(str);

        if (node.nodes.size() > 0) {
            for (Node n : node.nodes) {
                getCode(n, n.c, stringBuilder);
            }
        } else {
            res.add(stringBuilder.toString());
        }

    }

    private void tree(Node node, List<List<String>> lls, int index) {

        List<String> cl = lls.get(index);
        for (String c : cl) {
            node.nodes.add(new Node(c));
        }
        index++;
        if (index < lls.size()) {
            for (Node n : node.nodes) {
                tree(n, lls, index);
            }
        }


    }


    private static List<String> char2String(char c) {
        List<String> characters = null;
        switch (c) {
            case '1':
                characters = Arrays.asList("");
                break;
            case '2':
                characters = Arrays.asList("a", "b", "c");
                break;
            case '3':
                characters = Arrays.asList("d", "e", "f");
                break;
            case '4':
                characters = Arrays.asList("g", "h", "i");
                break;
            case '5':
                characters = Arrays.asList("j", "k", "l");
                break;
            case '6':
                characters = Arrays.asList("m", "n", "o");
                break;
            case '7':
                characters = Arrays.asList("p", "q", "r", "s");
                break;
            case '8':
                characters = Arrays.asList("t", "u", "v");
                break;
            case '9':
                characters = Arrays.asList("w", "x", "y", "z");
                break;


        }
        return characters;
    }

    private class Node {

        String c;
        List<Node> nodes;

        public Node(String c) {
            this.c = c;
            nodes = new ArrayList<>();
        }

    }
}

 

 

おすすめ

転載: blog.csdn.net/LPL0129/article/details/96201985