1. 程式人生 > >演算法篇:輸出集合的所有子集

演算法篇:輸出集合的所有子集

題目描述:

輸出含有n個元素集合的所有子集。例如,三個元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.

輸入:abc

輸出:

cba
ba
ca
a
cb
b
c
null

解題思路:

遞迴思路:

* 例如:對於集合{a,b,c}來說,我們如果獲得它的所有子集,我們可以分兩部分:
* 1.獲取集合{b,c}的所有子集(問題規模見減小)

* 2.{b,c}的所有子集中都新增進入a
* 這兩部分的和,恰好是整個集合{a,b,c}的子集

public static List<String> subSet(String str){
		List<String> list=new ArrayList<String>();
		if(str.length()==0){//遞迴結束條件
			list.add(null);//如果字串為空,新增一個空集合
			return list;
		}
		//獲取str中,除去第一個元素後,子串的所有元素的子集
		List<String> subList=subSet(str.substring(1));
		for(String string:subList){//將第一個元素新增到所有子串中
			if(string==null){//如果是空集
				list.add(""+str.charAt(0));
			}else {
				list.add(string+str.charAt(0));
			}
		}
		list.addAll(subList);//合併這兩個部分
		return list;
	}

執行:
public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list = subSet("abcde");
		System.out.println("子集的數目:"+list.size());
		for(String string:list){
			System.out.println(string);
		}
	}

結果

子集的數目:32
edcba
dcba
ecba
cba
edba
dba
eba
ba
edca
dca
eca
ca
eda
da
ea
a
edcb
dcb
ecb
cb
edb
db
eb
b
edc
dc
ec
c
ed
d
e
null

關於遞迴的一點感悟

1.先弄清楚遞迴的順序。在遞迴的實現中,通常假設後續的呼叫已經完成,在此基礎上,才實現遞迴的邏輯。在該題中,我們假設子串的所有子集已經求出的情況下,再將第一個元素新增進去,再進行合併。

2.分析清楚遞迴的邏輯

3.考慮好遞迴的退出條件,也就是邊界條件。

相關推薦

演算法輸出集合所有子集

題目描述:輸出含有n個元素集合的所有子集。例如,三個元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.輸入:abc輸出:cbabacaacb

演算法計算字串中子串的出現次數(java)

演算法篇:計算字串中子串的出現次數(java) 方法一:使用String類的substring(indexStart,indexEnd)方法 首先解釋一下substring(indexStart,indexEnd)方法: str.substring(indexStart,inde

機器學習演算法從為什麼梯度方向是函式變化率最快方向詳談梯度下降演算法

梯度下降法是機器學習中常用的引數優化演算法,使用起來也是十分方便!很多人都知道梯度方向便是函式值變化最快的方向,但是有認真的思考過梯度方向是什麼方向,梯度方向為什麼是函式值變化最快的方向這些問題嘛,本文便以解釋為什麼梯度方向是函式值變化最快方向為引子引出對梯度

機器學習演算法最大似然估計證明最小二乘法合理性

最小二乘法的核心思想是保證所有資料誤差的平方和最小,但我們是否認真思考過為什麼資料誤差平方和最小便會最優,本文便從最大似然估計演算法的角度來推導最小二乘法的思想合理性,下面我們先了解一下最大似然估計和最小二乘法,最後我們通過中心極限定理剋制的誤差ε服從正態分佈

Python實踐第二輸出素數(質數)表

堅持本系列一貫的風格,不多廢話,直接上程式碼。def print_prime(n): i = 2 while i < n: if i == 1 or i == 2:

演算法神奇的卡塔蘭數Catalan

這段時間複習資料結構,想起來這神奇的卡塔蘭數1.百科簡介卡塔蘭數的來歷:卡特蘭數又稱卡塔蘭數,是組合數學中一個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894

Girls' research(已完善的Manacher演算法模板輸出最長迴文子串)

One day, sailormoon girls are so delighted that they intend to research about palindromic strings. Operation contains two steps: First step: girls will wr

演算法SGD+logistic+Adaboost構建快速迭代增強式LR模型

寫在最前: - 之前在新浪開個部落格寫東西,總有些不方便,後來看了CSDN,內建Markdown,寫起來突感一見如故,十分感動。 - 工作中由於經常需要做一些視覺化和演算法類的研究,所以開個CSDN總結和記錄一下。 下面主要講的是

輸出一個集合的冪集(所有子集

問題描述:如一個抽象集合{1,2,3},它的所有子集包括{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}共2的n次方個,此問題又叫求集合的冪集。 一、遞迴實現    

深度優先演算法求含有N個元素的集合的全部組合(即集合中選1,2,3...N個元素的所有組合,不是排列)

先來看一道題:給定整數:a1, a2, a3.....an, 判斷是否可以從中選出任意個數,使其和等於K, (數字的個數,取1--N個數都可以), 這道題要求找出這N個數中選1,2,3...N個元素的所有組合,如果任何一個組合滿足和為K, 就找到了答案,所以:本質上,這道題

輸入一個集合輸出這個集合所有子集

package cn.edu.bupt.sherry; import java.util.ArrayList; import java.util.Scanner; public class Test

給定一個集合輸出它的所有子集

題目:集合是由大字字母(A-Z)組成的,要求輸出集合的所有子集,每個子集一行,不能使用遞迴。 例如 “ABD”的子集: NULL(空集)、A、B、C、AB、AC、BC、ABC(共8個) 這個題可以用點陣圖的思想做。 比如集合{A,B} 對應位向量v=000...0001

python入門輸出1-100之內的所有奇數和偶數

utf env false 報錯 pytho 賦值 1-1 pass 所有 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #輸出1-100之內的所有奇數和偶數 4 """ 5 給start賦值等於1,whi

Matlab高階教程_第二關於MATLAB轉C#過程中遇到輸出兩組引數的問題

1. 在matlab的m函式很可能遇到原函式[a,b] = func(a); 這樣的兩個輸出引數。 2. 在觀察C#生成後定義中我們發現: public MWArray HP(); public MWArray HP(MWArray Y); public MWArray HP(MWArray Y, M

C語言輸出100-1000之間的所有迴文數並統計

從左到右讀和從右到左讀大小都是一樣的數稱為迴文數 #include<stdio.h> void main() { int i,j,k,s = 0; for(i = 101; i < 1000; i++) { k = i; j = 0; do {

Java集合集合細節集合指定初始容量、asList的缺陷、subList的缺陷

一、為集合指定初始容量: 集合是我們在Java程式設計中使用非常廣泛的,它就像大海,海納百川,像萬能容器,盛裝萬物,而且這個大海,萬能容器還可以無限變大(如果條件允許)。當這個海、容器的量變得非常大的時候,它的初始容量就會顯得很重要了,因為挖海、擴容是需要消耗大量的人力物力財力的。同樣的道理,C

Java集合fail-fast機制 與 fail-safe

在JDK的Collection中我們時常會看到類似於這樣的話: 例如,ArrayList: 注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步併發修改做出任何硬性保證。快速失敗迭代器會盡最大努力丟擲 ConcurrentModificationExcepti

Java集合Map總結

相關閱讀: Java基礎篇:hashCode的作用 Java集合篇:HashMap原理詳解 Java集合篇:Hashtable原理詳解 、Hashtable與HashMap的區別 Java集合篇:ConcurrentHashMap詳解(JDK1.6) Java集合篇:Concur

機器學習筆記 第2課適用於所有演算法的原則

機器學習中的監督學習演算法,常常用於預測建模。這些演算法有一個共通的原則。 人們一般這樣來描述機器學習演算法:學習一個目標函式(f),能夠最好地將輸入變數(X)對映到輸出變數(Y)。 Y = f(X) 這是一個常見的學習任務。我們期望在給定新的輸入變數(X)時,對(Y)做出預測。 我們並不知

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第2垃圾回收演算法

上一篇:Java記憶體區域與記憶體溢位異常:https://blog.csdn.net/pcwl1206/article/details/83990008 第2篇:垃圾回收演算法 一、判斷物件是否存活的演算法 1、引用計數法 2、可達性分析演算法 3、再談引用 4