題目:
給定一個僅包含數字 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());
}
}
}