1. 程式人生 > >JAVA實現abc字串的排列組合

JAVA實現abc字串的排列組合

1.可重複排列:abc三個字元組成的所有長度為3的字串,aaa,aab,aac......ccc 一共27種

利用遞迴的思想,第一個字元可以從abc中選擇一個,三種選擇,之後問題轉化為abc組成長度為2的字元的情況,迴圈遞迴後可以求出所有的可能。控制好迴圈退出條件即可。 利用遞迴可以處理,不知道字元長度的情況下,即通用處理。如果知道長度,只需要利用多層迴圈,也可以得出結論。
public class Permutation {
	public static void main(String[] args) {
		char[] chs = {'a','b','c'};
		per(new char[3], chs, 3-1);
	}
	public static void per(char[] buf, char[] chs, int len){
		if(len == -1){
			for(int i=buf.length-1; i>=0; --i)
				System.out.print(buf[i]);
			System.out.println();
			return;
		}
		for(int i=0; i<chs.length; i++){
			buf[len] = chs[i];
			per(buf, chs, len-1);
		}
	}
}
可重複選擇,一共27種情況,結果如下圖所示

2.全排列:還是abc三個字元,全排列即字元不能重複。最後 3*2 =6種結果

可以利用1中的方法,只要判斷3個字元是否相等,都不相等的才是需要的全排列裡的一個。這樣的時間複雜度為n^n,而全排列的種類為n!所以需要設計一種n!的演算法。 也可以利用遞迴,第一個字串一共有n種選擇,剩下的變成一個n-1規模的遞迴問題。而第一個字元的n種選擇,都是字串裡面的。因此可以使用第一個字元與1-n的位置上進行交換,得到n中情況,然後遞迴處理n-1的規模,只是處理完之後需要在換回來,變成原來字元的樣子。
public class Arrange {
	public static void main(String[] args) {
		char[] chs = {'a','b','c'};
		arrange(chs, 0, chs.length);
	}
	public static void arrange(char[] chs, int start, int len){
		if(start == len-1){
			for(int i=0; i<chs.length; ++i)
				System.out.print(chs[i]);
			System.out.println();
			return;
		}
		for(int i=start; i<len; i++){
			char temp = chs[start];
			chs[start] = chs[i];
			chs[i] = temp;
			arrange(chs, start+1, len);
			temp = chs[start];
			chs[start] = chs[i];
			chs[i] = temp;
		}
	}
}
執行結果如下圖所示,一共6種組合

3.組合:abc三個字元的所有組合

求所有組合也就是abc各個位是否選取的問題,第一位2中可能,第二位2種。。。所以一共有2^n種。用0表示不取,1表示選取,這樣可以用110這樣的形式表示ab。abc一共的表示形式從0到2^3-1。然後按位與運算,如果結果為1就輸出當前位,結果0不輸出。
public class Comb {
	public static void main(String[] args) {
		char[] chs = {'a','b','c'};
		comb(chs);
	}

	public static void comb(char[] chs) {
		int len = chs.length;
		int nbits = 1 << len;
		for (int i = 0; i < nbits; ++i) {
			int t;
			for (int j = 0; j < len; j++) {
				t = 1 << j;
				if ((t & i) != 0) { // 與運算,同為1時才會是1
					System.out.print(chs[j]);
				}
			}
			System.out.println();
		}
	}
}
輸出結果如下,第一行為空,表示一個都不取