216.组合总和III
思路:
跟组合思路一样,不同是加一个 限定条件 和为 n,
修改跳出条件即可:
if (k == path.size()) {
if (sum == n) {
res.add(new ArrayList<>(path));
}
return;
}
其余回溯逻辑和组合相同,只不过参数需要加入一个 sum 记录path数组和。
剪枝操作可以在 遍历过程中保持 sum <= n, 如果 sum > n,则停止搜索。
17.电话号码的字母组合
思路:
使用map 或者 list 记录每个数字对应的字母
回溯搜索每个数字对应的字母组合。
回溯函数参数需要记录 遍历当前数组的索引。
class Solution {
Map<Character, String> map = new HashMap<>(){
{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}
};
List<String> res = new ArrayList<>();
StringBuilder tmp = new StringBuilder();
public List<String> letterCombinations(String digits) {
if (digits.length() == 0) return res;
backtracking(digits, 0);
return res;
}
private void backtracking(String digits, int index) {
if (tmp.length() == digits.length()) {
res.add(tmp.toString());
return;
}
String str = map.get(digits.charAt(index));
for (int i = 0; i < str.length(); i++) {
tmp.append(str.charAt(i));
backtracking(digits, index+1);
tmp.deleteCharAt(tmp.length() - 1);
}
}
}