题目描述:
给定一个仅包含数字 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']
的一个数字。
标签:貌似没看到哪个公司考这个。。
解答:
class Solution {
static char[] two = new char[]{'a', 'b', 'c'};
static char[] three = new char[]{'d', 'e', 'f'};
static char[] four = new char[]{'g', 'h', 'i'};
static char[] five = new char[]{'j', 'k', 'l'};
static char[] six = new char[]{'m', 'n', 'o'};
static char[] seven = new char[]{'p', 'q', 'r', 's'};
static char[] eight = new char[]{'t', 'u', 'v'};
static char[] nine = new char[]{'w', 'x', 'y', 'z'};
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
List<Character> holder = new ArrayList<>();
dfs(res, holder, digits, 0);
return res;
}
void dfs(List<String> res, List<Character> holder, String digits, int index) {
if (index == digits.length()) {
StringBuilder string = new StringBuilder();
for (char c: holder) {
string.append(c);
}
if (index > 0)
res.add(string.toString());
return;
}
char[] chars = getChars(digits, index);
for (char c: chars) {
holder.add(c);
dfs(res, holder, digits, index+1);
holder.remove(holder.size()-1);
}
}
char[] getChars(String digits, int index) {
if (digits.charAt(index) == '2') {
return two;
}
if (digits.charAt(index) == '3') {
return three;
}
if (digits.charAt(index) == '4') {
return four;
}
if (digits.charAt(index) == '5') {
return five;
}
if (digits.charAt(index) == '6') {
return six;
}
if (digits.charAt(index) == '7') {
return seven;
}
if (digits.charAt(index) == '8') {
return eight;
}
if (digits.charAt(index) == '9') {
return nine;
}
return new char[0];
}
}
优化的话,用map来映射char 数字和字母,字母用字符串就好。可以用StringBuilder替代List,然后string.deleteCharAt(index)可以删除。