day23 17. 电话号码的字母组合&&216. 组合总和 III
- 电话号码的字母组合(LeetCode 17)
问题描述
给定一个仅包含数字 2-9 的字符串 digits,返回它能表示的所有字母组合。数字到字母的映射与电话按键相同(与字母表顺序不同)。答案可以按任意顺序返回。
代码实现
代码使用了深度优先搜索(DFS)来生成所有可能的字母组合。
映射数组:
使用一个字符串数组 str,将数字 2-9 映射到对应的字母组合(例如,2 对应 "abc",3 对应 "def")。
DFS 回溯:
使用递归函数 dfsLetterCombinations,通过逐层遍历每个数字对应的字母,并将其添加到路径 path 中。
当路径长度等于输入字符串 digits 的长度时,将路径加入结果列表 res。
使用 path.deleteCharAt(path.length() - 1) 实现回溯,移除路径中的最后一个字符,以便尝试其他可能的组合。
边界条件:
如果输入字符串为空或为 null,直接返回空结果列表。
//17. 电话号码的字母组合
public List
List
if (digits == null || digits.isEmpty()) return res;
String[] str = new String[8];
StringBuilder path = new StringBuilder();
str[0] = "abc";
str[1] = "def";
str[2] = "ghi";
str[3] = "jkl";
str[4] = "mno";
str[5] = "pqrs";
str[6] = "tuv";
str[7] = "wxyz";
dfsLetterCombinations(digits,res,str,path,0);
return res;
}
private void dfsLetterCombinations(String digits, List
if (digits.length()==path.length()){
res.add(path.toString());
return;
}
for (char c : str[digits.charAt(start) - '2'].toCharArray()) {
path.append(c);
dfsLetterCombinations(digits,res,str,path,start+1);
path.deleteCharAt(path.length()-1);
}
}
-
组合总和 III(LeetCode 216)
问题描述
找出所有相加之和为 n 的 k 个数的组合,数字范围为 1-9。每个数字只能使用一次,结果可以按任意顺序返回。
代码实现
代码同样使用了深度优先搜索(DFS)来生成所有满足条件的组合。
DFS 回溯:
使用递归函数 dfsCombinationSum3,通过逐个尝试从 start 到 9 的数字,将其加入路径 stack 中。
如果路径长度等于 k 且路径中数字的总和等于 n,将路径加入结果列表 res。
使用 stack.push(i) 和 stack.pop() 实现路径的添加和回溯。
剪枝条件:
如果当前路径的和已经大于目标值 n,或者剩余的数字数量不足以满足路径长度要求(k - stack.size() > n - start + 1),提前返回,避免无效搜索。
使用全局变量 sum 记录当前路径的和。
边界条件:
如果路径长度等于 k 且路径和等于 n,将路径加入结果列表。
时间复杂度
最坏情况下需要遍历所有可能的组合,时间复杂度为 O(C(9, k)),其中 C(9, k) 表示从 9 个数字中选择 k 个数字的组合数。
空间复杂度
递归调用栈的深度为 k,因此空间复杂度为 O(k)。
//216. 组合总和 III
private int sum=0;
public List<List> combinationSum3(int k, int n) {
List<List> res = new ArrayList<List >();
LinkedListstack = new LinkedList<>();//记录路径
dfsCombine(n,k,res,stack,1);
return res;
}private void dfsCombinationSum3(int n, int k, List<List
> res,LinkedList stack,int start) {
if(stack.size()==k&& sum == n) {
res.add(new ArrayList<>(stack));
return;
}
for (int i = start; i <= 9; i++) {
if ((sum>=n)||(k-stack.size()>n-start+1)) return;
sum+=i;
stack.push(i);
dfsCombine(n, k, res, stack, i+1);
sum-=i;
stack.pop();
}
}

浙公网安备 33010602011771号