2017-10-16 18 views
0

Je sais que je peux obtenir toutes les sous-chaînes d'une chaîne donnée comme ceci:Tous les sous-chaînes et « semi-substrings » d'une chaîne

String inputString = "abcde"; 

java.util.Set<String> substrings = new java.util.TreeSet<>(); 
int strLength = inputString.length(); 
for(int i=0; i<strLength; i++) 
    for(int j=0; j<=strLength-i; j++) 
    substrings.add(inputString.substring(i, i+j)); 

qui me obtenir le résultat suivant dans la série:

a, ab, abc, abcd, abcde, b, bc, bcd, bcde, c, cd, cde, d, de, e, 

Cependant, je veux obtenir en quelque sorte la liste suivante à la place:

a, ab, abc, abcd, abcde, abce, abd, abde, abe, ac, acd, acde, ace, ad, ade, ae, b, bc, bcd, bcde, bce, bd, bde, be, c, cd, cde, ce, d, de, e 

Ainsi, en plus de tous les sous-chaînes, Je veux également les chaînes lorsque vous supprimez un ou plusieurs caractères entre les deux (c.-à-d. ace en supprimant b et d).

Quelle serait la façon la plus simple d'y parvenir? REMARQUE: Tous les caractères doivent rester dans le même ordre, sinon je combinerais toutes les permutations d'une chaîne avec toutes les sous-chaînes de ces chaînes.

+0

Que voulez-vous dire avec * « Cependant, je suis après la liste suivante au lieu » *? –

+0

@NikolasCharalambidis Je vais le reformuler, mais je voulais dire que c'est le résultat que je recherche. Je ne suis pas sûr de savoir comment accomplir cela. –

Répondre

1

Vérifiez cette solution. Mon instructeur dans ma classe de génie logiciel nous a fourni cette solution il y a quelques temps. Je l'ai édité un peu pour m'assurer que vous obtenez un ensemble ordonné avec TreeSet.

public static Set<String> stringSubsets(String str) { 
    if (str.isEmpty()) { 
     return new TreeSet<>(Arrays.asList("")); 
    } else { 
     char currentChar = str.charAt(0); 
     String rest = str.substring(1); 

     Set<String> combinationsOfRest = stringSubsets(rest); 
     Set<String> result = new TreeSet<>(); 

     result.addAll(combinationsOfRest); 
     for (String c: combinationsOfRest) 
      result.add(currentChar + c); 

     return result; 
    } 
} 
+0

Parfait merci! Je vais l'accepter comme une réponse dans une minute quand je peux. –

0
  1. Changer votre inputString-char[]
  2. pour la sortie: a,b,c,d,e juste imprimer char[i] dans un simple for loop
  3. pour deux lettres sorties comme: ab, ac etc. - boucle faire dans une boucle comme vous fait, donc char[i] + char [j] va être votre sous-chaîne
  4. pour trois lettres de sortie - faire boucle dans une boucle comme dans une étape 3., mais dans ce cas, supprimer de la char[] tableau char[i] and char[j], alors y ous obtenir les lettres dans le bon ordre
  5. pour quatre lettres sortie supprimer un char[i] en utilisant simple boucle