代码随想录刷题记录day23 组合问题+电话号码的字母组合
参考:代码随想录
216. 组合总和 III
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zClsxbGs-1668936527384)(temp.assets/image-20221120171532436.png)]
思想
组合问题,path 去收集符合条件的路径,res去收集结果。
for循环表示集合的广度,递归表示树的深度。
剪枝:当sum>n时,就可以终止,向上返回
代码
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
//使用数字1到9 k个数 相加为 n
backTracking(k,n,0,1);
return res;
}
public void backTracking(int k, int n,int sum,int startIndex){
if(sum>n) return;
if(path.size()==k){
if(sum==n){
res.add(new ArrayList<>(path));
}
return ;
}
//单层递归的逻辑
for(int i=startIndex;i<=9;i++){
sum+=i;
path.add(i);
backTracking(k,n,sum,i+1);
path.remove(path.size()-1);
sum-=i;
}
}
}
17. 电话号码的字母组合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDYOdMme-1668936527388)(temp.assets/image-20221120172359987.png)]
思想
需要先将数字到字符做一个映射 用一个数组保存起来(刚开始这一步不知道怎么做)
String [] strArray={。。。}; 字符数组
用一个index 去记录 穿入的字符串”23“的下标 ,index=0 表示字符2,对应strArray[2] 的”abc“
另外集合的遍历都是从0开始的,不同于前面的组合问题,从startIndex开始,这是因为这里的遍历时两个集合。
代码
class Solution {
List<String> res=new ArrayList<>();
StringBuilder path=new StringBuilder();
public List<String> letterCombinations(String digits) {
// 解析字符串 放入map?
String[] strArray={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backTracking(strArray,digits,0);
return res;
}
public void backTracking(String[] strArray,String digits,int index){
if(digits==null || digits.equals("") ) return ;
if(path.length()==digits.length()){
res.add(new String(path));
return;
}
int digit=digits.charAt(index)-'0';//获取字符串"23"所对应的数字,即获取2
String str=strArray[digit];
for(int i=0;i<str.length();i++){
path.append(str.charAt(i));
backTracking(strArray,digits,index+1);
path.deleteCharAt(path.length()-1);
}
}
}