電話號碼的字母組合(Letter Combinations of a Phone Number)

題目:Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters. 

輸入輸出:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
public List<String> letterCombinations(String digits) {
    
    List<String> list = new ArrayList();

    //如果字符串爲空,直接返回
    if(digits.length() == 0 || digits == null) return list;

    //對每個按鍵進行分配字母
    char[][] letter = {
        {},                   //0
        {},                   //1
        {'a','b','c'},        //2
        {'d','e','f'},        //3
        {'g','h','i'},        //4
        {'j','k','l'},        //5
        {'m','n','o'},        //6
        {'p','q','r','s'},    //7
        {'t','u','v'},        //8
        {'w','x','y','z'},    //9
        };
        //通過回溯法,進行查詢有多少中組合方式,從0開始,開始字符串爲""
        combination(digits,0,letter,"",list);  
    return list;
    }
    //組合方式
    //digits 代表查詢的號碼
    //index  開始查詢的位置
    //letter 對應的字母表
    //res    加上一位當前號碼對應的字母之後,組成的字符串
    //list   用於存最後的所有可能組合字符串
    public void combination(String digits,int index,char[][] letter,String res,List<String> list){
        //對當前數字可以打出的按鍵進行添加
        for(int i = 0; i < letter[(digits.charAt(index) - '0')].length;i++){
            //因爲每次都只添加其中之一,所以每次用一個上次新的字符串
            String s = res;
            //加上一個當前數字的一個字母
            s += letter[(digits.charAt(index) - '0')][i];
            //如果下面還有,開始繼續往下走
            if(index + 1 < digits.length()) combination(digits,index+1,letter,s,list);
            //如果下面沒有了,也就意味着每個字母都加入一個字母了
            //那麼直接把這個字符串加入到列表
            else list.add(s);
        }
    }

總結:其實包含10個數字和包含9位是一樣的,把整個號碼看作一個子問題,每次處理一位,最後就可以得到結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章