力扣第17题电话号码的字母组合
一、题目:17.
二、题目解析:
改题主要就是让我们找出数字对应字符的组合问题,这个排列组合可以用树的形式表示出来,说白了就是把根结点到叶子结点上的每一条路径的所有字符加起来。
从而问题就被转换成了从根结点到叶子结点一共有多少条路径:
三、代码如下:
public List<String> letterCombinations(String digits) {
//使用一个集合来存储所有的字母组合结果
List<String> combinations = new ArrayList<>();
if (digits == null || digits.length() == 0)
return combinations;
//将号码字母对应关系存储进Map
//存储为数组更好操作
HashMap<Character, String> map = new HashMap<Character, 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");
}};
//回溯
backTracking(combinations,map,0,digits,new StringBuilder());
return combinations;
}
private void backTracking(List<String> combinations,Map<Character,String> phoneMap,int index,String digits,StringBuilder sb) {
//递归到叶子结点,找到一个结果,则加到结果集
if(index == digits.length()){
combinations.add(sb.toString());
}else {
char c = digits.charAt(index);
String letters = phoneMap.get(c);
int length = letters.length();
for (int i = 0; i < length ; i++) {
sb.append(letters.charAt(i));
backTracking(combinations,phoneMap,index+1,digits,sb);
//递归到一个叶子节点后,需要找下一个组合,这里开始回溯
sb.deleteCharAt(index);
}
}
}
四、测试
五、结束
