Java實(shí)現(xiàn)abc字符串排列組合
1.可重復(fù)排列:abc三個(gè)字符組成的所有長(zhǎng)度為3的字符串,aaa,aab,aac......ccc 一共27種
利用遞歸的思想,第一個(gè)字符可以從abc中選擇一個(gè),三種選擇,之后問(wèn)題轉(zhuǎn)化為abc組成長(zhǎng)度為2的字符的情況,循環(huán)遞歸后可以求出所有的可能。控制好循環(huán)退出條件即可。
利用遞歸可以處理,不知道字符長(zhǎng)度的情況下,即通用處理。如果知道長(zhǎng)度,只需要利用多層循環(huán),也可以得出結(jié)論。
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);
}
}
}
可重復(fù)選擇,一共27種情況,結(jié)果如下圖所示

2.全排列:還是abc三個(gè)字符,全排列即字符不能重復(fù)。最后 3*2 =6種結(jié)果
可以利用1中的方法,只要判斷3個(gè)字符是否相等,都不相等的才是需要的全排列里的一個(gè)。這樣的時(shí)間復(fù)雜度為n^n,而全排列的種類為n!所以需要設(shè)計(jì)一種n!的算法。
也可以利用遞歸,第一個(gè)字符串一共有n種選擇,剩下的變成一個(gè)n-1規(guī)模的遞歸問(wèn)題。而第一個(gè)字符的n種選擇,都是字符串里面的。因此可以使用第一個(gè)字符與1-n的位置上進(jìn)行交換,得到n中情況,然后遞歸處理n-1的規(guī)模,只是處理完之后需要在換回來(lái),變成原來(lái)字符的樣子。
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;
}
}
}
運(yùn)行結(jié)果如下圖所示,一共6種組合

3.組合:abc三個(gè)字符的所有組合
求所有組合也就是abc各個(gè)位是否選取的問(wèn)題,第一位2中可能,第二位2種。。。所以一共有2^n種。用0表示不取,1表示選取,這樣可以用110這樣的形式表示ab。abc一共的表示形式從0到2^3-1。然后按位與運(yùn)算,如果結(jié)果為1就輸出當(dāng)前位,結(jié)果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) { // 與運(yùn)算,同為1時(shí)才會(huì)是1
System.out.print(chs[j]);
}
}
System.out.println();
}
}
}
輸出結(jié)果如下,第一行為空,表示一個(gè)都不取

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單的模板渲染
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的模板渲染的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
MyBatis分頁(yè)插件PageHelper的使用與原理
提到插件相信大家都知道,插件的存在主要是用來(lái)改變或者增強(qiáng)原有的功能,MyBatis中也一樣,下面這篇文章主要給大家介紹了關(guān)于Mybatis第三方PageHelper分頁(yè)插件的使用與原理,需要的朋友可以參考下2023-02-02
關(guān)于MyBatis中映射對(duì)象關(guān)系的舉例
這篇文章主要介紹了關(guān)于MyBatis中映射對(duì)象關(guān)系的舉例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot后端接口的實(shí)現(xiàn)(看這一篇就夠了)
這篇文章主要介紹了SpringBoot后端接口的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java實(shí)現(xiàn)動(dòng)態(tài)代理
本文給大家介紹的是java使用動(dòng)態(tài)代理類實(shí)現(xiàn)動(dòng)態(tài)代理的方法和示例,這里推薦給大家,有需要的小伙伴參考下吧2015-02-02
簡(jiǎn)單了解java中靜態(tài)初始化塊的執(zhí)行順序
這篇文章主要介紹了簡(jiǎn)單了解java中靜態(tài)初始化塊的執(zhí)行順序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

