文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/080dc8235fd98332a3acdb1dabe4d953.png)
- 先用hash表存储九键键盘映射,保存不同数字按键对应的字母是什么
- 然后通过回溯算法枚举即可。
- 因为这道题是要组合,而不是排列。也就是说"ad"和"ba"是相同答案,只保留一个即可
- 按照题目的示例1来看,可以看出是按键2依次遍历,然后按键3依次遍历。例如按键2先遍历a,然后按键3依次遍历d,e,f。组成了"ad",“ae”,“af”. 然后回到按键2,遍历b,然后按键3,依次遍历d,e,f。以此类推。
- 很经典的回溯题目。这种题嵌套for循环显然不行,因为8个有字母的按键,需要8层for循环。只能用递归,也就是回溯来解决。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b2c3ef73f9d315a6a43dad995b263f95.png)
class Solution {
char[][] hash = new char[10][];
String digits;
int length;
public void init(){
String str = "abcdefghijklmnopqrstuvwxyz";
for(int i = 2,index = 0;i <= 9;i++){
if(i==7 || i==9) hash[i] = new char[4];
else hash[i] = new char[3];
for(int j = 0;j<hash[i].length;j++) hash[i][j] = str.charAt(index++);
}
}
ArrayList<String> list = new ArrayList<>();
public List<String> letterCombinations(String digits) {
init();
this.digits = digits;
this.length = digits.length();
char[] records = new char[length];
backTracking(0,records);
return list;
}
public void backTracking(int row,char[] records){
if(row > length-1) return;
else{
int hashRow = digits.charAt(row)-48;
for(int i = 0;i<hash[hashRow].length;i++){
records[row] = hash[hashRow][i];
if(row < length-1) backTracking(row+1,records);
else list.add(new String(records));
}
}
}
}