17.电话号码的字母组合
思路
本题也是组合的回溯操作,区别于前面两题,这题的回溯操作是在不同的集合内,因此需要考虑在每一层的递归时应该确定哪一个集合,那么在for循环的范围就可控制为这个数字对应的字母数量。
此外,还需考虑digits映射问题,可以使用map或String数组来控制,事先在构建时加入。
按照回溯模板,递归结束是按每次遍历完digits中的元素一次,即当前保存字符的temp大小等于digits的大小。
代码
List<String> list=new ArrayList<>();
StringBuilder temp=new StringBuilder();
int sum=0;
public List<String> letterCombinations(String digits) {
if (digits==null || digits.length()==0) return list;
String[] numString={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int len=digits.length();
backtracking(0,numString,digits);
return list;
}
public void backtracking(int num,String[] numString,String digits){
if (digits.length()== temp.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(num+1,numString,digits);
temp.deleteCharAt(temp.length()-1);
}
}