给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
使用回溯法
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);
}
}
}