DFS专题:电话号码的字母组合
题目链接: 17.电话号码的字母组合
参考题解: 代码随想录
题目描述
代码思路
将数字到字母的映射用字符串数组表示出来。然后利用回溯算法,解决n个for循环的问题,枚举出每一种符合要求的情况。
代码纯享版
class Solution {
public List<String> list = new ArrayList();
StringBuffer str = new StringBuffer();
public List<String> letterCombinations(String digits) {
String[] match = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int num = 0;
if(digits.length() != 0 && digits != null){
backtrack(digits, match, num);
}
return list;
}
void backtrack(String digits, String[] match, int num){
if(num == digits.length()){
list.add(str.toString());
return;
}
String temp = match[digits.charAt(num) - '0'];
for(int i = 0; i < temp.length(); i++){
str.append(temp.charAt(i));
backtrack(digits, match, num + 1);
str.deleteCharAt(str.length() - 1);
}
}
}
代码逐行解析版
class Solution {
public List<String> list = new ArrayList(); //用于记录所有字母组合
StringBuffer str = new StringBuffer(); //记录某个字母组合
public List<String> letterCombinations(String digits) {
//形成数字到字母的映射
String[] match = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int num = 0; //用于判断要映射digits的第几个数字
if(digits.length() != 0 && digits != null){
backtrack(digits, match, num); //回溯
}
return list;
}
void backtrack(String digits, String[] match, int num){
//当两者相等时,说明已经形成一个符合要求的字母组合
if(num == digits.length()){
list.add(str.toString()); //将字母组合加入list中
return;
}
//temp用来表示当前digits第num位数字所映射到的字母
String temp = match[digits.charAt(num) - '0'];
for(int i = 0; i < temp.length(); i++){ //循环遍历当前数字下的每一种字母情况
str.append(temp.charAt(i)); //将字母添加到字符串str中
backtrack(digits, match, num + 1); //递归到下一个数字位
str.deleteCharAt(str.length() - 1); //回溯,删掉最后一个字母
}
}
}
代码有关问题的解释
能不能将backtrack(digits, match, num + 1);
改为
num++;
backtrack(digits, match, num);
答:不能。这样会导致num在循环中重复加很多次,导致递归时出现问题。