使用递归算法来解。
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中,并返回。