1. 程式人生 > 其它 >LeetCode No17. 電話號碼的字母組合

LeetCode No17. 電話號碼的字母組合

題目

給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。

給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。

 

示例 1:

輸入:digits = "23"
輸出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

輸入:digits = ""
輸出:[]

示例 3:

輸入:digits = "2"
輸出:["a","b","c"]

提示:

0 <= digits.length <= 4
digits[i] 是範圍 ['2', '9'] 的一個數字。

思路

其實就是一個全排列的問題,資料範圍也不大,打表記好每個數字對應的字元,直接一波回溯即可。

AC程式碼

點選檢視程式碼
class Solution {
    List<String> list;
    char[] chars;
    StringBuffer sb;
    Map<Character, Character[]> map = new HashMap<>(){{
        put('2', new Character[]{'a', 'b', 'c'});
        put('3', new Character[]{'d', 'e', 'f'});
        put('4', new Character[]{'g', 'h', 'i'});
        put('5', new Character[]{'j', 'k', 'l'});
        put('6', new Character[]{'m', 'n', 'o'});
        put('7', new Character[]{'p', 'q', 'r', 's'});
        put('8', new Character[]{'t', 'u', 'v'});
        put('9', new Character[]{'w', 'x', 'y', 'z'});
    }};

    private void DFS(int index) {
        if( index==chars.length) {
            list.add(sb.toString());
            return ;
        }
        Character[] ch = map.get(chars[index]);
        for(char cha: ch) {
            sb.append(cha);
            DFS(index+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }

    public List<String> letterCombinations(String digits) {
        list = new ArrayList<>();
        if(digits.length()==0) {
            return list;
        }
        chars = digits.toCharArray();
        sb = new StringBuffer();
        DFS(0);
        return list;
    }
}