使用递归算法来解。
public static List<String> getAllCombinations() {
// 定义26个字母数组
char[] alphabet = new char[26];
for (int i = 0; i < 26; i++) {
alphabet[i] = (char)('a' + i);
}
// 定义结果列表
List<String> result = new ArrayList<>();
// 从长度1到长度26生成所有组合
for (int i = 1; i <= 26; i++) {
getCombinations(alphabet, "", i, result);
}
return result;
}
private static void getCombinations(char[] alphabet, String prefix, int k, List<String> result) {
if (k == 0) {
result.add(prefix);
return;
}
for (int i = 0; i < 26; i++) {
// 避免重复,只向后添加字母
if (prefix.length() == 0 || alphabet[i] > prefix.charAt(prefix.length() - 1)) {
getCombinations(alphabet, prefix + alphabet[i], k - 1, result);
}
}
}
解释:
该代码通过递归函数getCombinations
实现了对所有情况的穷举,并将结果保存到列表result中。
首先定义了包含26个字母的字符数组alphabet,然后遍历从长度为1到长度为26的所有可能的组合,在getCombinations
函数中,使用递归方式遍历字母表,通过检查前缀字符串prefix的最后一个字符来避免重复。
当k = 0时,将结果添加到列表result中,并返回。