给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。
注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
class Solution {
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<String>();
if(digits.length() == 0) return list;
fun(list,"",digits,0);
return list;
}
public void fun(List<String> list,String node,String digits,int count){
char c = digits.charAt(count);
if(c == '1' && count < digits.length() - 1){
fun(list,node,digits,++count);
return;
}
int b = c + 47 + (2 * (Integer.parseInt(c+"") - 2));
if(c == '8' || c == '9'){
b++;
}
c = (char) b;
if(count == digits.length() - 1){
if(c == '^'){
list.add(node);
return;
}
if(c != 'p' && c != 'w'){
list.add(node+c);
list.add(node+(char)(c+1));
list.add(node+(char)(c+2));
}else{
list.add(node+c);
list.add(node+(char)(c+1));
list.add(node+(char)(c+2));
list.add(node+(char)(c+3));
}
return;
}
count = ++count;
if(c != 'p' && c != 'w'){
fun(list,node+c,digits,count);
fun(list,node+(char)(c+1),digits,count);
fun(list,node+(char)(c+2),digits,count);
}else{
fun(list,node+c,digits,count);
fun(list,node+(char)(c+1),digits,count);
fun(list,node+(char)(c+2),digits,count);
fun(list,node+(char)(c+3),digits,count);
}
}
}