/*串中取3个不重复字母
* 从标准输入读入一个由字母构成的串(不大于30个字符)。
从该串中取出3个不重复的字符,求所有的取法。
取出的字符,要求按字母升序排列成一个串。
不同的取法输出顺序可以不考虑。
例如:
输入:
abc
则输出:
abc
输入:
abcd
则输出:
abc
abd
acd
bcd
输入:
abcaa
则输出:
abc
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class Demo03 {
// 去掉重复元素,放入lis
public static void removeDuplicate(String s,Set<Character> lis){
for(char x:s.toCharArray()){
lis.add(x);
}
}
// 为方便操作 将 sets 转 lis
public static void convert(List<Character> lis,Set<Character> sets){
Iterator<Character> iter = sets.iterator();
while(iter.hasNext()){
lis.add(iter.next());
}
}
// 检测符合条件的元素组合
public static void check(Set<Character> sets){
List<Character> lis = new ArrayList<Character>();
convert(lis,sets); // 为方便操作 将 sets 转 lis
StringBuffer sb = new StringBuffer();
for(int i=0;i<lis.size()-2;i++){
for(int j=i+1;j+1<lis.size();j++){ // 向后添加两位,所以 j+1<lis.size()
for(int k=j+1;k<lis.size();k++){
sb.append(lis.get(i));
sb.append(lis.get(j));
sb.append(lis.get(k));
System.out.println(sb); // 输出组合
sb.setLength(0); // 清空
}
}
}
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("输入串(不大于30个字符)。");
String s = scan.nextLine();
Set<Character> sets = new LinkedHashSet<Character>();
removeDuplicate(s,sets); // 去掉重复元素,放入lis
check(sets); // 检测符合条件的元素组合
}
}
运行结果:
输入串(不大于30个字符)。
abcd
abc
abd
acd
bcd