一、题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
二、解法
1、暴力穷举
(1)思路描述
列举所有可能性
(2)代码
public static List<String> letterCombinations(String digits) {
Map<Character,String> map=new HashMap<Character,String>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
int len=digits.length();
int i=0;
List<String> list=new ArrayList<String>();
while(i<len){
String tmpStr=map.get(digits.charAt(i)); //当前字符
int tmpLen=tmpStr.length();
List<String> tmpList=new ArrayList<String>();
if(list.size()>0) {
for (int j = 0; j < list.size(); j++) {
for (int k = 0; k < tmpLen; k++) {
tmpList.add(list.get(j) + tmpStr.charAt(k));
}
}
}else{
for (int k = 0; k < tmpLen; k++) {
tmpList.add("" + tmpStr.charAt(k));
}
}
list=tmpList;
i++;
}
return list;
}
2、深度搜索
(1)思路
将目前已产生的组合combination和接下来的数字串next_digits作为参数
如果没有更多的数字需要被输入,则意味着当前的组合已经产生好了
(2)代码
static Map<String,String> phoneMap=new HashMap<String,String>(){{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
static List<String> list=new ArrayList<String>();
public static List<String> letterCombinations(String digits) {
if(digits.length()!=0){
backtrack("",digits);
}
return output;
}
//组合、剩余数字串
public static void backtrack(String combination,String next_digits){
if(next_digits.length()==0){
list.add(combination);
}else{
String digit=next_digits.substring(0,1); //数字
String letters=phoneMap.get(digit); //对应字母,abc
for(int i=0;i<letters.length();i++){
String ch=letters.substring(i,i+1); //其中一个字母,如a
backtrack(combination+ch,next_digits.substring(1));
}
}
}