1. 程式人生 > >輸出字串的所有組合的java實現

輸出字串的所有組合的java實現

問題描述:假設字串中的所有字元不重複,如何輸出字串的所有組合,例如,輸入字串為“abc”,則輸出a、b、c、ab、ac、bc、abc,共7種組合。

根據題意,如果字串中有n個字元,根據排列組合的性質,此時一共需要輸出2^n-1種組合。

最容易想到的方式是遞迴,遍歷字串,每個字串只能取或不取。若取該字元,就把它放到結果字串中,遍歷完畢後,輸出結果字串。

程式程式碼為:

public class CombineRecursiveImpl {
	public static void main(String[] args) {
		char[] c=s.toCharArray();
		StringBuffer sb=new StringBuffer("");
		System.out.println(sb);
		int len=c.length;
		for(int i=1;i<=len;i++){
			Solution3.combineRecursive(c, 0, i, sb); 
		}
		
	}

}

class Solution3{
	public static void combineRecursive(char[] c,int begin,int len,StringBuffer sb){
		if(len==0){
			System.out.print(sb+" ...");
			return;
		}
		if(begin==c.length){
			return;
		}
		sb.append(c[begin]);
		System.out.print(sb+",");
		combineRecursive(c, begin+1, len-1, sb);
		sb.deleteCharAt(sb.length()-1);
		System.out.print(sb+",");
		combineRecursive(c, begin+1, len, sb);
	}
}
執行結果為:

 a  b  c  ab  ac  bc abc

採用遞迴法求解,當n的值不是很大時,不存在效率低下的問題,但當n比較大時,效率會變得很差,因為棧呼叫次數約為2^n,為了提高效率,考慮本題的特性,可以構造一個長度為n的01字串(或二進位制數)表示輸出結果中是否包含某個字元,例如,“001”表示輸出結果中不含字元a、b,只含c,即輸出結果為c,而“101”,表示輸出結果為ac。原題就是要求輸出“001”到“111”這2^n-1個組合對應的字串。

程式程式碼如下:

public class CombineRecursiveImpl {

	public static void main(String[] args) {
		String s="abc";
		char[] c=s.toCharArray();
		Solution4.Combine(c);
	}

}

class Solution4{
	public static void Combine(char[] c){
		if(c==null){
			return;
		}
		int len=c.length;
		boolean[] used=new boolean[len];
		char cache[]=new char[len];
		int result=len;
		while(true){
			int index=0;
			while(used[index]){
				used[index]=false;
				++result;
				if(++index==len){
					return;
				}
			}
			used[index]=true;
			cache[--result]=c[index];
			System.out.print(new String(cache).substring(result)+" ");
		}
	}
}

執行結果為:

 a  b  c  ab  ac  bc abc

相關推薦

兩個陣列求和為一個固定數值的所有組合java實現

如標題上說的,輸入為a : {1,2,3,4}, b: {1,2,3,4} 輸出為 {1,4},{2,3},{3,2},{4,1} 輸入資料沒有重複,沒有負數。不過這裡我給出的解並不高效率。要考慮怎麼樣降低複雜度。當數字的個數很多的時候,這樣的一個程式沒有辦法解決目標問題

字串-----輸出字串所有組合

方法一:遞迴,遍歷字串,每個字元只能取或者不取;取該字元的話,就把字元放入到結果字串中,遍歷完畢後,輸出結果字串; #include <stdio.h> #include <string.h> #define MAXSIZE 1024 #defin

輸入一串不重複的字串,列出所有可能的組合(java實現)

1、輸入一串不重複的字串,列出所有可能的組合    例:輸入字串: abc    輸出:    abc    acb    bac    bca    cab    cba 分析:這是一道很好的考查對遞迴理解的程式設計題,我們以三個字元 abc為例來分析一下求字串排列的過程

PAT乙級——1084(模擬 字串操作)java實現

題目:外觀數列 (20 分) 外觀數列是指具有以下特點的整數序列: d, d1, d111, d113, d11231, d112213111, … 它從不等於 1 的數字 d 開始,序列的第 n+1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1

PAT乙級——1081(字串判斷)Java實現

題目:檢查密碼 (15 分) 本題要求你幫助某網站的使用者註冊模組寫一個密碼合法性檢查的小功能。該網站要求使用者設定的密碼必須由不少於6個字元組成,並且只能有英文字母、數字和小數點 .,還必須既有字母也有數字。 輸入格式: 輸入第一行給出一個正整數 N(≤ 100),隨後 N 行

PAT乙級——1086(字串操作)java實現

題目:就不告訴你 (15 分) 做作業的時候,鄰座的小盆友問你:“五乘以七等於多少?”你應該不失禮貌地圍笑著告訴他:“五十三。”本題就要求你,對任何一對給定的正整數,倒著輸出它們的乘積。 輸入格式: 輸入在第一行給出兩個不超過 1000 的正整數 A 和 B,其間以空格分隔。

PAT乙級——1091(字串操作)Java實現

題目:N-自守數 (15 分) 如果某個數 K 的平方乘以 N 以後,結果的末尾幾位數等於 K,那麼就稱這個數為“N-自守數”。例如 3×92​2​​ =25392,而 25392 的末尾兩位正好是 92,所以 92 是一個 3-自守數。 本題就請你編寫程式判斷一個給定的數字是否

PAT乙級——1093(字串匹配)Java實現

題目:字串A+B (20 分) 給定兩個字串 A 和 B,本題要求你輸出 A+B,即兩個字串的並集。要求先輸出 A,再輸出 B,但重複的字元必須被剔除。 輸入格式: 輸入在兩行中分別給出 A 和 B,均為長度不超過 10​6​​ 的、由可見 ASCII 字元 (即碼值為32~12

1001:A+B 輸入輸出練習II【JAVA實現

標籤 輸入輸出練習 題目描述 你的任務是計算a+b。 輸入格式 第一行是一個整數N,表示後面會有N行a和b,通過空格隔開。 輸出 對於輸入的每對a和b,你需要在相應的行輸出a、b的和。 如第二對a和b,對應的和也輸出在第二行。 樣例輸入

字串字串平移(java實現

    對於一個字串,請設計一個演算法,將字串的長度為len的字首平移到字串的最後。給定一個字串A和它的長度,同時給定len,請返回平移後的字串。 測試樣例: "ABCDE",5,3 解析:解題思路比較簡單,假設字串長度為n,則首先分別逆序0-(len-1)和len-(n-

列印二叉樹所有路徑---JAVA實現

思路:把當前結點儲存到陣列當中,如果當前結點為葉子結點就列印當前陣列,採取遞迴的方式來進行操作。 技巧一:就是陣列的問題,所有路徑結點都存到一個數組當中,由於陣列傳遞是傳址,改變陣列指向內容的時候其他

輸出字串所有的子串

思路:(1)通過字串的總長度,可知它的所有子串的長度分佈範圍             (2)按子串長度分類,依次找出每個長度段的所有子串 關鍵函式:substrvoid FindStr(const string&str) { string sub; int le

給定一個數組,求出陣列元素的排列和組合——Java實現

1. 思路 組合數C(n,m)和全排列A(n,n)可以通過遞迴的方式,直接實現。 而A(n,m)則可以通過組合數和全排列間接求出A(n,m)=C(n,m)*A(m,m),即對得到的組合數中的每個元素進行全排列 2. Java實現 package com.zfy.test

獲取某一時間段特定星期幾的所有日期(Java實現)

廢話不多說,還是直接上程式碼,有需要的童孩可以自行研究: /** * 獲取某一時間段特定星期幾的日期 * @author finder.zhou */ public class WeekDayUtil { public static void main(Strin

劍指offer--面試題28:字串的排列--Java實現

題目描述: 輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。 解題思路: 我們求整個字串的排列,可以看成兩步,首先求可能出現在第一個位置上的字元,

1000:A+B 輸入輸出練習I【JAVA實現

題目描述 你的任務是計算a+b。這是為了acm初學者專門設計的題目。你肯定發現還有其他題目跟這道題的標題類似,這些問題也都是專門為初學者提供的。 輸入格式 輸入包含一系列的a和b對,通過空格隔開。一對a和b佔一行。 輸出 對於輸入的每對a和b,你需要依

在二叉樹中找出和為某一值的所有路徑-java實現

一個小演算法,分享一下思路: 描述: 寫一個程式建立一棵二叉樹,並按照一定規則,輸出二叉樹根節點到葉子節點的路徑。 規則如下: 1、從最頂端的根結點,到最下面的葉子節點,計算路徑通過的所有節點的和,如果與設定的某一值的相同,那麼輸出這條路徑上的所有節點。 2、從根節點遍歷

輸出字串所有組合java實現

問題描述:假設字串中的所有字元不重複,如何輸出字串的所有組合,例如,輸入字串為“abc”,則輸出a、b、c、ab、ac、bc、abc,共7種組合。根據題意,如果字串中有n個字元,根據排列組合的性質,此時一共需要輸出2^n-1種組合。最容易想到的方式是遞迴,遍歷字串,每個字串只

Java筆試題】輸出字串所有組合

1、題目 輸入一個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。 2、解題思想 首先建立combine函式,對於字串進行處理,如果字串為空,則直接輸出;如果字串不為空,則建立StingBuild

JAVA 輸出指定字串所有排列組合

題目介紹: 輸出給定陣列或者字串,輸出所有排列可能。 例如:給定字串為 1234. 輸出所有排列可能:1234 1324 1423 1432.。。。。。。。  下面程式碼是蒐集到的比較簡潔的實現方式。共享一下 public class MySocket { public