2016-02-25 2 views
2

J'essaie de trouver tous les sous-ensembles d'une chaîne donnée. Par exemple, la chaîne "Rum" aurait les sous-ensembles "rhum", "ru", "rm", "r", "um", "u", "m", et "". Voici mon code à ce jour:Infinite Récursion pour trouver les sous-ensembles d'une chaîne?

import java.util.Collections; 
import java.util.ArrayList; 
import java.util.List; 
public class SubsetGenerator 
{ 
    private String word; 

    public SubsetGenerator(String in) 
    { 
     word=in; 
    } 
    public ArrayList<String> findSubsets() 
    { 
     ArrayList<String> subsets = new ArrayList<String>(); 
     String temp = word; 
     if(temp.length()==1) 
     { 
      subsets.add(temp); 
      return subsets; 
     } 
     else 
     { 
      String removed = temp.substring(0,1); 
      temp = temp.substring(1); 
      findSubsets(); 
      subsets.add(word); 
     } 
     return subsets; 
    } 

} 

et voici le testeur:

import java.util.Collections; 
import java.util.ArrayList; 
import java.util.List; 
/** 
This program tests the subset generator. 
*/ 
public class SubsetGeneratorTester 
{ 
public static void main(String[] args) 
{ 
SubsetGenerator generator = new SubsetGenerator("rum"); 

List<String> subsets = generator.findSubsets(); 
// Sort the result for checking 
Collections.sort(subsets); 
System.out.println(subsets); 
System.out.println("Expected: [, m, r, rm, ru, rum, u, um]"); 
} 
} 
+0

Que êtes-vous en ce moment? – ifly6

+0

@ ifly6 une récursion infinie Exception in thread "main" java.lang.StackOverflowError \t à java.lang.String.substring (String.java:1969) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t à SubsetGenerator.findSubsets (SubsetGenerator.java:26) \t at SubsetGenerator.findSubsets (SubsetGenerator.java:26 – AnaviLucas

+0

Vous devriez regarder la réponse SO sur [StackOverflowError] (http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror). – ifly6

Répondre

0

Votre méthode est quelque peu déroutant. Je suggère que vous utilisiez un algorithme semblable à ceci:

public class SubsetGenerator { 
    private String word; 
    private ArrayList<String> list; 

    public SubsetGenerator(String word) { 
     //constructor and initialize variables 
    } 

    void findSubsets(String str) { 
     list.add(str) 

     for(int i = 0 ; i < str.length() ; i++) { 
      String substring = /*str with char at index i removed*/ 
      this.findSubsets(substring); 
     } 
    } 
} 

cela devrait inclure tous les variants. J'espère que cela aide.

+0

La suppression d'un caractère au milieu de la chaîne ne crée pas une sous-chaîne valide. – nbrooks

+0

@nbrooks pourquoi pas? Dans sa question "rm" est une sous-chaîne valide de "rhum" – Maljam

+0

Vous avez raison, je ne savais pas que l'exemple de l'OP comprenait cela. Je suppose que c'est peut-être pourquoi ils l'ont appelé un 'sous-ensemble' plutôt qu'une 'sous-chaîne' puisque, par définition, une [sous-chaîne] (https://en.wikipedia.org/wiki/Substring) est une chaîne qui se produit dans une autre chaîne. Donc, techniquement, ce que cet algorithme produit n'est pas une sous-chaîne, mais une [sous-séquence] (https://en.wikipedia.org/wiki/Subsequence). Semble être ce que l'OP veut bien! – nbrooks

0

J'ai écrit une solution de retour en arrière récursif:

import java.util.Collections; 
import java.util.ArrayList; 
import java.util.List; 
public class SubsetGenerator 
{ 
    private String word; 
    private ArrayList<String> temp; 

    public SubsetGenerator(String in) 
    { 
     word=in; 
     temp = new ArrayList<String>(); 
    } 
    public void solve(int idx, String s){ 
     if(idx == word.length()){ 
      temp.add(s); 
      return; 
     } 
     solve(idx+1, s + word.charAt(idx)); 
     solve(idx+1, s); 
    } 
    public ArrayList<String> findSubsets(){ 
     solve(0, ""); 
     return temp; 
    } 
}