/**
首先创建HashMap,初始化号码与字母间的映射关系
大致执行流程:
首先依次从每个字符集中选取第一个元素,直到访问完所有字符集,将结果添加到res中
回溯,访问最后一个字符集的第二个元素,将结果添加到res中;再回溯,重复上述流程直到最后一个字符集的所有元素访问完毕
回溯,重复上述流程,访问倒数第二个个字符集的所有元素,直到倒数第二个字符集所有元素访问完毕
.......
直到第一个字符集所有元素被访问,得到所有结果
所需参数:
String tempResult保存单次结果; index控制可访问的字符集
操作细化(for循环 + 递归):
终止条件 index == digits.size() 代表最后一个字符集访问完毕
递归时index递增,访问下一个字符集;回溯时通过for循环迭代访问字符集中下一个字符
*/
class Solution {
//Hash表,初始化号码与字母间的映射关系
private Map<Character,String> phoneMap;
//临时保存单次结果
StringBuilder tempResult = new StringBuilder();
//保存结果集
List<String> res = new ArrayList<>();
//避免重复传参
private String digits;
public List<String> letterCombinations(String digits) {
/**
首先创建HashMap,初始化号码与字母间的映射关系
大致执行流程:
首先依次从每个字符集中选取第一个元素,直到访问完所有字符集,将结果添加到res中
回溯,访问最后一个字符集的第二个元素,将结果添加到res中;再回溯,重复上述流程直到最后一个字符集的所有元素访问完毕
回溯,重复上述流程,访问倒数第二个个字符集的所有元素,直到倒数第二个字符集所有元素访问完毕
.......
直到第一个字符集所有元素被访问,得到所有结果
所需参数:
String tempResult保存单次结果; index控制可访问的字符集
操作细化(for循环 + 递归):
终止条件 index == digits.size() 代表最后一个字符集访问完毕
递归时index递增,访问下一个字符集;回溯时通过for循环迭代访问字符集中下一个字符
*/
if(digits.isEmpty()) {
return res;
}
//初始化
this.digits = digits;
this.phoneMap = 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");
}};
backtrack(0);
return res;
}
private void backtrack(int index) {
if(index == digits.length()) {
res.add(tempResult.toString());
return;
}
//通过index获取当前该访问的字符集
Character c = digits.charAt(index);
String s = phoneMap.get(c);
for(Character c1 : s.toCharArray()) {
//将当前字符添加到temp中
tempResult.append(c1);
//递归时index + 1 访问下一个字符集
backtrack(index + 1);
//回溯,回退tempResult的状态 迭代c1访问字符集中的下一个字符
tempResult.deleteCharAt(tempResult.length() - 1);
}
}
}