17. 电话号码的字母组合
难度 中等
给定一个仅包含数字 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']
的一个数字。
题解
这道题就是把9键上的字母进行组合,那我们就需要进行枚举,但是长度不定,一般的for循环枚举没办法完成,那就用递归循环进行枚举,枚举完第n个位置的字母,再递归n+1个字母。
例如”23“,枚举第一个元素的时候,2对应的是”abc“,进入递归枚举时,枚举了a;然后进入第二次递归,3对应的是”def“,枚举了d之后,进入第三层递归,发现枚举长度等于数组长度,结束枚举,添加字符”ad“进入结果集;又分别枚举e和f,添加字符串”ae“和”af“。
第二层枚举结束之后,又回到第一层枚举,枚举b,有进入第二次枚举,分别枚举了d,e和f,添加字符串“bd”,“be”和“bf”。
以此类推,完成所有枚举,就得到数字对应的字符串了。
class Solution {
String[] word = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//9键对应的字母
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){//长度为零,返回空
return new ArrayList<String>();
}
List<String> list = new ArrayList<String>();//存储结果
char[] temp = new char[digits.length()];//辅助字符串
dfs(digits, 0, temp, list);
return list;
}
void dfs(String digits, int idx, char[] temp, List<String> list){//idx为当前枚举第几个元素
if(idx == digits.length()){//枚举长度等于字符串长度,枚举结束
list.add(new String(temp));
return;
}
int nowi = digits.charAt(idx) - '0';//获取字符串第idx个字符,转为数字
String now = word[nowi - 2];//获取2~9数字对应的字母
for(int i = 0; i < now.length(); i++){
temp[idx] = now.charAt(i);//修改辅助字符串第idx个字符
dfs(digits, idx + 1, temp, list);//递归枚举idx+1个字母
}
}
}