本题进一步强化了回溯的做法,需要用到字符串相关API,挺头疼。
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;
//对String字符串从索引为0的位置开始寻找符合条件的结果
backtrack(digits,0);
return res;
}
// 回溯函数
private void backtrack(String digits,int index) {
//结束条件:如果sb字符串的长度和digits字符串长度相同,说明循环到结尾需要判断是否符合结果了
//这里也可以令index==digits.length(),终止条件判断都相同
if(sb.length() == digits.length()) {
//向res结果集放入结果并终止此循环,回溯上层继续其他循环。
res.add(sb.toString());
return;
}
//val是当前所以位置数字对应的三个字母
String val = map[digits.charAt(index)-'2'];
//需要对val转成char,其实不转也行,用val.charAt(index)
for(char ch:val.toCharArray()) {
//向sb中加入val中遍历的当前字母
sb.append(ch);
//递归,在sb中有一个值的前提寻找下一个值
backtrack(digits,index+1);
//遍历结束后,需要将当前值删除,回溯。
sb.deleteCharAt(sb.length()-1);
}
}
}