要解决如下三个问题:
- 数字和字母如何映射
- 输入1 * #按键等异常情况
数字和字母如何映射:
可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组
string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
回溯三部曲:
确定回溯函数参数:首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量我依然定义为全局。
这个num是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时num也表示树的深度。
- 确定终止条件
例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。
那么终止条件就是如果num 等于 输入的数字个数(digits.length)了(
然后收集结果,结束本层递归。
class Solution {
List<String> list = new ArrayList<>();
//每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuild
StringBuilder temp = new StringBuilder();
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return list;
}
// //初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串""
String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
backTracking(digits, numString, 0);
return list;
}
public void backTracking(String digits,String[] numString, int num){
//num用来遍历digits的
if(num == digits.length()){
list.add(temp.toString());
return;
}
String str = numString[digits.charAt(num) - '0'];
for(int i =0; i <str.length(); i++){
temp.append(str.charAt(i));
backTracking(digits,numString,num + 1);
temp.deleteCharAt(temp.length() - 1);
}
}
}