来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
class Solution {
// 数字到号码的映射数组
private String[] map = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
// 路径
private StringBuilder sb = new StringBuilder();
// 结果集
private List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) return res; // 如果digits为null 则digits.length()就会报空指针异常 所以这里先判断是否为空 再调用函数
backtrack(digits,0); // 从第0个位置的数字及第一个数字开始转换
return res;
}
// 回溯函数
private void backtrack(String digits,int index) {
if(sb.length() == digits.length()) { // 已全部转换完成
res.add(sb.toString()); // 将缓冲区中内容转成字符串即可
return;
}
String val = map[digits.charAt(index)-'2']; // 将下标为 index-2 处的数字转换成字符串 注意需 -2
for(char ch:val.toCharArray()) {
sb.append(ch);
backtrack(digits,index+1);
sb.deleteCharAt(sb.length()-1); // 回溯 撤销在这一步的选择 当有一个序列全部转换完成时 需回溯至最初 转换下一组
}
}
}