JAVA递归找所有子集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA递归找所有子集相关的知识,希望对你有一定的参考价值。
比如“rum”的子集有“rum”, “ru”, “rm”, “r”, “um”, “u”, “m”, “” .
这个是Tester:
import java.util.Collections;
import java.util.ArrayList;
/**
This program tests the subset generator.
*/
public class SubsetGeneratorTester
public static void main(String[] args)
SubsetGenerator generator = new SubsetGenerator("rum");
ArrayList<String> subsets = generator.getSubsets();
Collections.sort(subsets);
System.out.println(subsets);
System.out.println("Expected: [, m, r, rm, ru, rum, u, um]");
import java.util.ArrayList;
public class SubsetGenerator
int[] indexs = null;
int COUNT = 1;// choose how many to be combination
ArrayList<String> list = new ArrayList<String> ();
private String subsets;
public SubsetGenerator( String subsets )
this.subsets = subsets;
public ArrayList<String> getSubsets ( int... params )
if(params.length == 0)
indexs = new int[subsets.length ()];
params = new int[2];
params[0] = 0;
params[1] = -1;
list.add ("");
params[1]++;
if(params[1] > COUNT - 1)
return list;
for( indexs[params[1]] = params[0]; indexs[params[1]] < subsets.length (); indexs[params[1]]++ )
getSubsets (indexs[params[1]] + 1, params[1]);
if(params[1] == COUNT - 1)
String temp = "";
for( int i = COUNT - 1; i >= 0; i-- )
temp += subsets.charAt (indexs[params[1] - i]);
list.add (temp);
if(COUNT < subsets.length () && params[0] == 0)
COUNT++;
getSubsets (0, -1);
return list;
package web;
import java.util.ArrayList;
import java.util.Collections;
public class SubsetGeneratorTester
public static void main ( String[] args )
SubsetGenerator generator = new SubsetGenerator ("rum");
ArrayList<String> subsets = generator.getSubsets ();
Collections.sort (subsets);
if(!"[, m, r, rm, ru, rum, u, um]".equals (subsets.toString ()))
System.err.println ("Expected: [, m, r, rm, ru, rum, u, um]");
else
System.err.println ("Congratulations !");
System.out.println ("Your result is: " + subsets);
追问
public ArrayList getSubsets ( int... params ) 不能有参数的
追答楼主,修改好了,查收
public class Test
ArrayList<String> list = new ArrayList<String>();
String input = "input";
/**
* @param args
*/
public static void main(String[] args)
Test t = new Test();
t.p();
System.out.println(t.list);
public void p()
for (int i=0;i<=input.length();i++)
for (int j=i;j<=input.length();j++)
if (j != i)
String str = input.substring(i,j);
list.add(str);
追问
要用recursion啊
使用递归函数,输出n个元素的所有子集
题目描述:
请编写一个递归函数,用来输出n个元素的所有子集。例如,三个元素a,b,c的所有子集是:,a,b,c,a,c,ac,b,c,a,b,c.
解题思路:
根据子集的定义,集合中的每一个元素在子集中都有两种状态:‘1’表示出现,'0'表示不出现;如果所有的元素都不出现,则该子集是空集,如果所有的元素都出现,则该子集是全集。
我们定义一个标记数组tag,用于记录集合中对应的元素是否出现,每层遍历对应集合中的每个元素,都有出现(为‘1’)和不出现(为‘0’)两种可能,一直遍历到所有的元素的可能都标记完,然后根据数组函数输出结果。
#include <iostream>
using namespace std;
void build(char *str,int *tag,int n)
if(n==5)
cout<<"";
for(int i=0;i<5;i++)
if(tag[i]==1)
cout<<str[i];
cout<<""<<endl;
return;
tag[n] = 0;
build(str,tag,n+1);
tag[n] = 1;
build(str,tag,n+1);
int main()
char a[5]='a','b','c','d','e';
int tag[5];
build(a,tag,0);
return 0;
输出结果:
e
d
de
c
ce
cd
cde
b
be
bd
bde
bc
bce
bcd
bcde
a
ae
ad
ade
ac
ace
acd
acde
ab
abe
abd
abde
abc
abce
abcd
abcde
以上是关于JAVA递归找所有子集的主要内容,如果未能解决你的问题,请参考以下文章