组合问题 去重 使用下标 startIndex
简单题 和之前的组合 类似
class Solution {
List<Integer> path = new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return res;
}
private void backtracking(int k, int n, int sum, int startIndex){
if(path.size() > k){
return;
}
if(sum > n){
return;
}
if(path.size() == k && 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);
sum -= i;
path.remove(path.size() - 1);
}
}
}
这题不难 主要是怎么构造出数字键盘
这里使用一个全局的map来存放数字和字母的对应关系
主要是一个Java封装的方法的使用
char c = string.charAt(i);
涉及频繁的字符串拼接 使用
StringBuilder sb = new StringBuilder();
class Solution {
Map<Character, String> map = null;
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if("".equals(digits)){
return res;
}
map = new HashMap<>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
StringBuffer sb = new StringBuffer();
backtracking(digits, sb, 0);
return res;
}
private void backtracking(String digits, StringBuffer sb, int index){
if(index == digits.length()){
res.add(sb.toString());
return;
}
char c = digits.charAt(index);
String s = map.get(c);
for(int i = 0; i < s.length(); i++){
sb.append(s.charAt(i));
backtracking(digits, sb, index + 1);
sb.deleteCharAt(sb.length() - 1);
}
}
}