17. 電話號碼的字母組合

題目:

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

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

示例:

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

代碼:

class Solution {
    
       public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList();
        if(digits.equals("")) return list;
        char[][] s = {{'a','b','c'},
                {'d','e','f'},
                {'g','h','i'},
                {'j','k','l'},
                {'m','n','o'},
                {'p','q','r','s'},
                {'t','u','v'},
                {'w','x','y','z'}};
        char[] nums = digits.toCharArray();
        
        int[] index = new int[nums.length];
        int[] len = new int[nums.length];
        for(int i=0;i<nums.length;i++){
            len[i] = s[nums[i]-50].length;
        }
        /**
         * 遍歷順序
         * 例 23
         * 2={a,b,c} 3={d,e,f}
         * 00 10 20 01 11 21 02 12 22
         * 00 10 20 分別指的是下標
         */
        while(true){
            StringBuffer sb = new StringBuffer();
            for(int i=0;i<nums.length;i++){
                if(index[i]<len[i]){
                    sb.append(s[nums[i]-50][index[i]]);
                }
                if(i==0) index[0]++;
                int t = 0;
                while(index[t] == len[t]){
                    //結束標誌
                    if(t==nums.length-1){
                        //結束前
                        list.add(sb.toString());
                        return list;
                    }else{
                        index[t]=0;
                        sb.append(s[nums[t+1]-50][index[t+1]%len[t+1]]);
                        index[++t]++;
                        i = t;
                    }
                }
            }
            list.add(sb.toString());
        }

    }
    
    
}

 

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