有一个set里有不同的字母{'a', 'b', 'c'}, 有一个整数值K,如果K=2,输出aa,ab,ac,ba,bb,bc,ca,cb,cc
follow up:组合中不包含相同字符怎么实现
follow up++:不用额外空间怎么做。
public static void main(String[] args) {
// char[] set = {'a','b','c','d'};
char[] set = { 'a', 'b', 'c' };
int k = 2;
List<List<Character>> res = getCombinationK1(set, k);
for (List<Character> list : res) {
for (char c : list) {
System.out.print(c + " ");
}
System.out.println();
}
String[] set1 = { "a", "b", "c" };
k = 2;
List<String> rest = getSet(set1, k);
for (String c : rest) {
System.out.print(c + " ");
}
}
private static List<List<Character>> getCombinationK1(char[] set, int k) {
List<List<Character>> res = new LinkedList<>();
List<Character> list = new LinkedList<>();
helper1(res, list, k, set, 0);
return res;
}
private static void helper1(List<List<Character>> res, List<Character> list, int k, char[] set, int pos) {
if (list.size() == k) {
res.add(new LinkedList<>(list));
return;
}
// for (int i = pos; i < set.length; i++) { //组合
for (int i = 0; i < set.length; i++) { // 排列
// if (list.contains(set[i])) { //是否包含重复的字符
// continue;
// }
list.add(set[i]);
// helper1(res, list, k, set, i + 1); //组合
helper1(res, list, k, set, i);
list.remove(list.size() - 1);
}
}
public static List<String> getSet(String[] set, int k) {
List<String> result = new ArrayList<String>();
result.add("");
for (int i = 0; i < k; i++) {
int size = result.size();
for (int j = 0; j < size; j++) {
String temp = result.get(0);
for (int z = 0; z < set.length; z++) {
result.add(temp + set[z]);
}
result.remove(0);
}
}
return result;
}