題目: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位是一樣的,把整個號碼看作一個子問題,每次處理一位,最後就可以得到結果。