文章目录
- 题目
- 思考
- 代码和注释
- 总结
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思考
- 1、使用递归回溯的方式来获取组合
- 2、之前我们都是在一个数组中完成递归,那两个数组我们就在这题就不需要startIdx来控制到递归的位置了
- 3、我们在定义递归参数的时候特别要注意
- 4、你想清楚这一题的树型结构了吗【其实是每个按键组成的是一层】
代码和注释
/**
使用回溯法
1、确定递归函数的参数
2、结束条件
3、每轮递归干的事
*/
class Solution {
// 临时路径字符串
StringBuilder pathStr = new StringBuilder();
// 存放结果集
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
// 极端判断
if(digits == null || digits.length()== 0){
return res;
}
// 定义一个数组来存放字母
String[] numToVal = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
backtacking(digits, numToVal, 0);
return res;
}
// num 是用来标记digits的下标位置的(控制只要num个元素即可)
public void backtacking(String digits, String[] numToVal, int num){
// 终止条件(由题目可知,我们由几个数组,就要组合成多少个元素)
// num控制的是for循环,也就是深度
if(digits.length() == num){
// 收集结果
res.add(pathStr.toString());
return;
}
// 每轮递归需要干的事
// 获取我们在按的每个数字(ascii计算的)
String str = numToVal[digits.charAt(num) - '0'];
// str.length()这个控制的是每一层的宽度
for(int i = 0; i<str.length(); i++){
pathStr.append(str.charAt(i));
backtacking(digits, numToVal, num + 1);
// 回溯
pathStr.deleteCharAt(pathStr.length() - 1);
}
}
}
总结
- 1、做到这题的时候对回溯有了一些新的理解
- a:我们使用的for循环里面的条件其实就是我们每一层树节点的宽度
- b:我们对递归的终止条件就是深度【其实就等价于我们目标值的长度,所有我们到对应的深度得到对应的深度的值,就没必要在向下递归来获取新的值了】