1.基于排列组合的DFS / 基于图的DFS
leetcode 17 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
// 首先定义返回集合,进行条件特判,存储电话按键数字字母关系。
class Solution {
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>(); //使用一个集合来存储所有的字母组合结果
if (digits == null || digits.length() == 0) return res;
//将号码字母对应关系存储进Map
HashMap<Character, String[]> map = new HashMap<>() {{ //存储为数组更好操作
put('2', new String[]{"a", "b", "c"});
put('3', new String[]{"d", "e", "f"});
put('4', new String[]{"g", "h", "i"});
put('5', new String[]{"j", "k", "l"});
put('6', new String[]{"m", "n", "o"});
put('7', new String[]{"p", "q", "r", "s"});
put('8', new String[]{"t", "u", "v"});
put('9', new String[]{"w", "x", "y", "z"});
}};
// 开始DFS
dfs(map, digits, res, 0, new StringBuilder());
return res;
}
public void dfs(HashMap<Character, String[]> map, String digits, List<String> res, int index, StringBuilder sb){
// index用来指导遍历digits每一个数字,当DFS到最深处时,存储sb
if(index == digits.length()){
res.add(sb.toString());
}else{
// 获取数字所代表的待使用的letters
String[] letters = map.get(digits.charAt(index));
// 遍历letters
for(String letter : letters){
// 加入第一个letter
sb.append(letter);
// DFS到下一个数字
dfs(map, digits, res, index + 1, sb);
// 每一个结果DFS到最深处时才会进行这一步,删除最后一个字母,避免重复
sb.deleteCharAt(index);
}
}
}
}