按电话上数字与字母的对应关系,如2={a,b,c},3={d,e,f}等,给定一串数字如267,则求出abc,mno,qprs的所有组合,如amq,amp...cor,cos等
遍历都可以用回溯的方式尝试解决,每次遍历结束后,将上一层元素删除,满足长度,则加入到结果中
public List<String> letterCombinations(String digits){
List<String> combinations = new ArrayList<>();
if(digits.length()==0){
return combinations;
}
Map<Character,String> digitLetterMap = new HashMap<>(){{
put('2',"abc");
put('3',"def");
put('4',"ghi");
put('5',"jkl");
put('6',"mno");
put('7',"qprs");
put('8',"tuv");
put('9',"wxyz");
}};
backtrack(combinations,digitLetterMap,digits,0,new StringBuffer());
return combinations;
}
public void backtrack(List<String> combinations,
Map<Character,String> digitLetterMap,
String digits,
int index,StringBuffer combination){
if(index == digit.legnth()){
combinations.add(combination.toString());
}else{
char digit = digits.charAt(index);
String letters = digitLetterMap.get(digit);
int letterCount = letters.legnth();
for(int i=0;i<letterCount;i++){
combination.append(letters.charAt(i));
backtrack(combinations,digitLetterMap,digits,index+1,combination);
combination.deleteCharAt(index);
}
}
}