【LeetCode】Letter Combinations of a Phone Number

【LeetCode】Letter Combinations of a Phone Number

題目

在手機九宮格鍵盤上輸入一串數字,給出可能打印出來的字符串的集合。

分析

  • 先做一個map將數字映射到鍵盤上相應的字母集合。
  • 把按鍵順序看成深度優先遍歷的深度,每次dfs將深度d+1直到d=按鍵字符串的長度未知,此時即完成了一次按鍵可能的輸出。

實現


    static Map<Integer, Character[]> map = new HashMap<Integer, Character[]>();   //數字鍵--鍵上的字母集合

    static {
        map.put(1, new Character[]{'\0'});
        map.put(2, new Character[]{'a', 'b', 'c'});
        map.put(3, new Character[]{'d', 'e', 'f'});
        map.put(4, new Character[]{'g', 'h', 'i'});
        map.put(5, new Character[]{'j', 'k', 'l'});
        map.put(6, new Character[]{'m', 'n', 'o'});
        map.put(7, new Character[]{'p', 'q', 'r', 's'});
        map.put(8, new Character[]{'t', 'u', 'v'});
        map.put(9, new Character[]{'w', 'x', 'y', 'z'});
        map.put(0, new Character[]{' '});

    }

    public List<String> letterCombinations(String digits) {
        ArrayList<String> result = new ArrayList<String>();
        if (digits == null || digits.length() == 0) return result;

        dfs(digits, 0, "", result);
        return result;
    }

    /**
     * 深度優先遍歷,每次將數字鍵上的字母拼接到s中,一旦到達底部,則將s放入結果集中,並返回
     */
    private void dfs(String digits, int d, String s, ArrayList<String> result) {
        if (d == digits.length()) {
            result.add(s);
            return;
        }
        Integer number = Integer.parseInt(digits.charAt(d) + "");  //得到輸入數字串在深度d時的數字

        for (Character c : map.get(number)) {                      //遍歷該數字對應的每一個字母
            dfs(digits, d + 1, s + c, result);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章