思路:组合这个词近似等价于遍历。这类组合要有两个循环,大条件是什么时候结束所有组合,小条件是什么时候结束一种组合。
//是否要clear()? 因为在循环开始的地方是在内部new al2,所以每次都是新的空的集合。
如果在外部new 那么就要clear
package com.hard;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/*输出一个字符数组中的所有字符的所有组合。比如有字符集str={A,B,C}
应输出:A B C AB AC BA BC CA CB ABC ACB BAC BCA CAB CBA
*/
public class CombinationChar {
@SuppressWarnings(“resource”)
public static void main(String[] args) throws IOException {
String s = new Scanner(System.in).nextLine();
String[] sa = new String[s.length()];
ArrayList<String> al = new ArrayList<String>(); //新建al集合
for (int i = 0; i < sa.length; i++) {
String str = String.valueOf(s.charAt(i));
sa[i]=str;
al.add(str);
}
//集合中最后一个元素的长度不是数组的长度
while (al.get(al.size() – 1).length() != sa.length)
{
//新建一个al2
ArrayList<String> al2 = new ArrayList<String>();
//遍历数组sa
for (int i = 0; i < sa.length; i++)
{
//遍历al
for (String str : al)
//如果al中的元素没有sa数组中第i个,并且此元素长度等于al集合的最后一个元素的长度
if (!str.contains(sa[i])&& str.length() == al.get(al.size() – 1).length())
al2.add(str + sa[i]);
}
al.addAll(al2);//是否要clear()?
}
System.out.println(“共有”+al.size()+”种组合,组合为:”+al);
}
}
转载于:https://my.oschina.net/zuodev/blog/663265