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]");

package web;

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 ) 不能有参数的

追答

楼主,修改好了,查收

参考技术A import java.util.ArrayList;




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;

输出结果:

 


de 

ce 
cd 
cde 

be 
bd 
bde 
bc 
bce 
bcd 
bcde 

ae 
ad 
ade 
ac 
ace 
acd 
acde 
ab 
abe 
abd 
abde 
abc 
abce 
abcd 
abcde 



以上是关于JAVA递归找所有子集的主要内容,如果未能解决你的问题,请参考以下文章

Java递归遍历集合

如何使用堆栈和队列非递归地生成所有可能的n元素集子集?

求子集 递归加回溯

递归查找所有的子集

递归 - 与数组结合,Java 中不重复

使用递归函数,输出n个元素的所有子集