题目:
给定“abcdefg” 7个字母,写一个程序将其中任意的字母组合输出,要求每种组合中每个字母最多出现一次,字母的不同位置顺序算不同的组合,例如ab和ba是不同的组合。
分析:
刚拿到题目时我就想用for循环穷举式的列出,但分析了一半分析不下去,因为是口述的题目,没有笔和纸来草算,所以当时没答上来。
后来我回顾,用笔和纸演算时发现了一个规律:
这个规律来自于“斐波那契数列”,就是每增加一个字母,这个结果就是这个字母与上一个结果的一个组合(交换顺序的组合)。于是我用java按照这种思想写了一个实现:
import java.util.ArrayList;
import java.util.List;
public class Test {
//a,b,ab,ba,c,ac,ca,bc,cb,abc,cab,bac,d,ad,da,bd,db,abd,bad,cd,acd,bcd,adcd,bacd,...
public static List<String> p(char c, List<String> li) {
int length = li.size();
li.add(String.valueOf(c));
for(int i =0;i<length;i++){
li.add(String.valueOf(c) + li.get(i));
li.add(li.get(i) + String.valueOf(c));
}
return li;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
String s = "abcdefg";
List<String> li = new ArrayList<String>();
li.add(String.valueOf(s.charAt(0)));
for (int i = 1; i < s.length();i++) {
char c1 = s.charAt(i);
li = p(c1, li);
}
for(String ss : li){
System.out.print(ss +",");
}
System.out.println(li.s