LeetCode No17. 电话号码的字母组合
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
思路
其实就是一个全排列的问题,数据范围也不大,打表记好每个数字对应的字符,直接一波回溯即可。
AC代码
点击查看代码
class Solution {
List<String> list;
char[] chars;
StringBuffer sb;
Map<Character, Character[]> map = new HashMap<>(){{
put('2', new Character[]{'a', 'b', 'c'});
put('3', new Character[]{'d', 'e', 'f'});
put('4', new Character[]{'g', 'h', 'i'});
put('5', new Character[]{'j', 'k', 'l'});
put('6', new Character[]{'m', 'n', 'o'});
put('7', new Character[]{'p', 'q', 'r', 's'});
put('8', new Character[]{'t', 'u', 'v'});
put('9', new Character[]{'w', 'x', 'y', 'z'});
}};
private void DFS(int index) {
if( index==chars.length) {
list.add(sb.toString());
return ;
}
Character[] ch = map.get(chars[index]);
for(char cha: ch) {
sb.append(cha);
DFS(index+1);
sb.deleteCharAt(sb.length()-1);
}
}
public List<String> letterCombinations(String digits) {
list = new ArrayList<>();
if(digits.length()==0) {
return list;
}
chars = digits.toCharArray();
sb = new StringBuffer();
DFS(0);
return list;
}
}
低调做人,高调做事。