0
votes

C # trouver des permutations "connectées"

Je travaille sur une table de dictionnaire et je suis nécessaire pour trouver toutes les combinaisons possibles de caractères dans un mot. Merci à https: // codereview.stackexchange.com/questions/28248/implement-a-fonction-that-print-Alt-Alt-Possieux-Combinations-Of-the-Characters-in , je suis resté ci-dessous travaillant jusqu'à présent:

a
b
c
ab
bc
abc


4 commentaires

@Sanisinghhuttunen - OP veut "connecté" caractères - "A" & "C" sont séparés par "B". Essentiellement, ce qu'il y a besoin est une liste de toutes les sous-chaînes de longueur 1 à pleine longueur - qui peut être facilement réalisée avec deux boucles.


Étant donné une chaîne de départ de "abab" - qu'est-ce que votre résultat attendu serait?


@Paulf Je suppose que les résultats acceptés seraient A, B, AB, BA, ABA, BAB, ABAB Si j'avais compris l'Op et il gère les bons en double gardant uniquement les uniques avec des caractères consécutifs.


@ DBLAZE47 YUP Exactement, c'est ce que j'aimerais réaliser, y compris la partie de l'élimination des doublons, mais "connecté" est ce que j'ai des problèmes.


3 Réponses :


1
votes

Je ne sais pas si je comprends "connecté" à droite ... Peut-être que vous pourriez simplement vérifier si un résultat potentiel fait partie de la chaîne d'origine ... quelque chose comme ceci:

public List<string> findAllOccurance(string str)
{
    var results = from e in Range(0, BigInteger.Pow(2, str.Length))
         let p =
             from b in Enumerable.Range(1, str.Length)
             select (e & BigInteger.Pow(2, b - 1)) == 0 ? (char?)null : str[b - 1]
         let p2 = string.Join(string.Empty, p)
         where str.Contains(p2)
         select p2;

    return results.ToList();
}

public IEnumerable<BigInteger> Range(BigInteger start, BigInteger count)
{
    while (count-- > 0)
    {
        yield return start++;
    }
}


0 commentaires

1
votes

Pour votre code, vous effectuez une opération binaire pour trouver tous les sous-ensembles possibles. Pour le cas ABC code> Votre longueur de chaîne est 3. Sous-ensèches si possible = 2 ^ 3 = 8. Écrivez-les et correspondez au bit le plus à l'avance avec l'indice le plus à gauche:

int max_size = BigInteger.Pow(2, str.Length);
int str_size = str.Length;
for(int i = 0; i < max_size; ++i) 
{ 
    string ans = "";
    for(j = 0; j < str_size; ++j) 
   { 
      // We check if the jth bit is set, we print the jth element from the string.
       if(i & (1 << j)) 
           ans += str[j];
       } 
       else {
           if(ans.Length > 0){
               // this means we have already added a character and then the next consecutive bit is '0'
               ans = "";
               break;
           }
       }
      if(ans != ""){
           Console.Writeline(ans); // we print the set. you can control this anyway you want.
      } 
   }   
} 


2 commentaires

Merci pour cette dbblase47, pouvez-vous m'aider à faire une certaine syntaxe ici? J'ai essayé de résoudre un simple tel que int j et si (i & (i & (i & (1 << j)) {, mais si le si montre une erreur disant ne pas convertir Bool.


Vérifiez si (1 << j)> 0



2
votes

par des permutations "connectées" - Vous recherchez efficacement toutes les soustrées de longueur 1 jusqu'à la longueur totale de la chaîne. Cela peut être très facile à faire avec deux pour les boucles. Les doublons peuvent être supprimés en utilisant la méthode distincte () de Linq.

List<string> result = new List<string>();
result.Add(String.Empty);
for (int i = 1; i <= str.Length; i++)
.....


0 commentaires