给一个不包含'0'
和'1'
的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。
下图的手机按键图,就表示了每个数字可以代表的字母。
1 | 2 ABC | 3 DEF |
---|---|---|
4 GHI | 5 JKL | 6 MNO |
7 PQRS | 8 TUV | 9 WXYZ |
样例
样例 1:
输入: "23"
输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
解释:
'2' 可以是 'a', 'b' 或 'c'
'3' 可以是 'd', 'e' 或 'f'
样例 2:
输入: "5"
输出: ["j", "k", "l"]
注意事项
以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。
解题思路:
DFS。
public class Solution {
/**
* @param digits: A digital string
* @return: all posible letter combinations
*/
public List<String> letterCombinations(String digits) {
// write your code here
List<String> res = new ArrayList<>();
if(digits == null || digits.length() == 0)
return res;
dfs(digits, new StringBuilder(), 0, res);
return res;
}
private String[] letterMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
private void dfs(String digits, StringBuilder sb, int index, List<String> res){
if(digits.length() == index){
res.add(sb.toString());
return;
}
for(char c : letterMap[digits.charAt(index) - '0'].toCharArray()){
sb.append(c);
dfs(digits, sb, index + 1, res);
sb.deleteCharAt(sb.length() - 1);
}
}
}