组合是从n个不同元素中,任取m(m<=n)个元素并成一组。
例:从a个球中选b个球
解:
public class Main {
// a个不同的球中取b个
static int fun(int a, int b) {
if (a == b || b == 0)
return 1;
return fun(a - 1, b - 1) + fun(a - 1, b);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
System.out.println(fun(a, b));
}
}
例:从A到E中选三个的所有组合
(因为是固定数目而且有顺序,所以可以用暴力循环)
解:
public class Main {
public static void main(String[] args) {
for (char i = 'A'; i <= 'E'; i++)
for (char j = (char) (i + 1); j <= 'E'; j++)
for (char k = (char) (j + 1); k <= 'E'; k++)
// 有""是为了让char转成String,输出的是字符串,而不是数字
System.out.println("" + i + j + k);
}
}
例:从一个字符串中选n个字符的所有组合
解:
public class Main {
static char[] c;
// index是数组下标,n是还要选几个,aim是目标串
static void fun(int index, int n, String aim) {
if (n == 0) {// n=0证明已经选好了,输出字符串
System.out.println(aim);
return;
}
if (index >= c.length)// 当选到没有得选时,就只能返回了
return;
fun(index + 1, n - 1, aim + c[index]);// 选下标为index的字符
fun(index + 1, n, aim);// 不选下标为index的字符
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
int n = in.nextInt();
c = s.toCharArray();
String aim = "";
fun(0, n, aim);
}
}
字符串中有重复的字符时,加个TreeSet就好。(TreeSet可以去除重复元素)
解:
public class Main {
static char[] c;
static TreeSet<String> ts = new TreeSet<>();
static void fun(int index, int n, String aim) {
if (n == 0) {
ts.add(aim);
return;
}
if (index >= c.length)
return;
fun(index + 1, n - 1, aim + c[index]);
fun(index + 1, n, aim);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
int n = in.nextInt();
c = s.toCharArray();
String aim = "";
fun(0, n, aim);
for (String ss : ts)
System.out.println(ss);
}
}