IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Calcul de l'ensemble des sous-séquences d'une chaîne


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Calcul de l'ensemble des sous-séquences d'une chaîne
    Bonjour à tous,

    Je sèche bêtement devant un problème qui pourtant me semble assez simple : je cherche à écrire une fonction qui prend une chaîne s et un entier n en paramètre, et qui m'affiche / me stocke l'ensemble des sous-séquences de s de taille au plus n.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sous_sequences("abca",3);
    a
    ab
    ac
    aa
    abc
    aba
    aca
    b
    bc
    ba
    bca
    c
    ca
    a
    (l'ordre d'affichage n'est pas important)

    Des idées ?
    Merci beaucoup de votre aide !

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Calcul le nombre de caractère de ta chaine en entrée.
    Après, une double boucle sur le nombre de char de ta chaine en entrée, et sur le deuxième argument devrait suffire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sous_sequences(chaine, entier)
     
      pour i de 0 à taille(chaine) - 1
        pour j de 0 à entier - 1
          si chaine[i+j] est valide
            afficher chaine[i,i+j]
          fin si
        fin pour
      fin pour
     
    fin sous_sequences

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse, mais attention, je ne cherche pas seulement les sous-séquences contiguës mais l'ensemble des sous-séquences (c'est-à-dire qu'il peut y avoir des trous, cf. l'exemple dans mon premier post).

  4. #4
    Scorpi0
    Invité(e)
    Par défaut
    Oups, effectivement ça me semblait trop simple ^^
    On reprend donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sous_sequences(chaine, entier)
     
       pour j de 0 à entier - 1
     
          /* Le problème revient ici a extraire les sous séquences de taille j de la chaine */
          sous_sequences2(j , chaine)
     
      fin pour
     
    fin sous_sequences

    Le problème se résume maintenant a extraire les combinaisons de j élément parmi taille(chaine) élément, genre un Cnp (CF wikipedia).
    Et la je pense que soit il existe des bibliothèques, soit tu doit coder ton propre générateur de combinaison, le plus probable étant un algo récursif je pense.

    Tu en tire une suite de j nombre compris entre 0 et taille[chaine], genre 1, 3, 5 si j=3, il ne te reste plu qu'a afficher chaine[1]||chaine[3]||chaine[5].

    Bon courage ^^

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse. J'ai également pensé à réduire le problème comme tu l'as fait. Et cela revient en effet à trouver toutes les suites d'entiers strictement croissantes de taille n (avec chaque entier compris entre 0 et la taille de la chaîne).

    Cela dit, j'ai essayé de réfléchir à une manière de coder cela et j'avoue que cela ne me vient pas Pour un n donné, c'est simple, il suffit d'imbriquer n boucles, mais je n'arrive pas à trouver la généralisation...

    Si quelqu'un connait l'existence d'une bibliothèque C capable de faire cela...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé mon bonheur dans le post suivant :
    http://www.developpez.net/forums/sho...d.php?t=429282

    Adapté en C, cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void partition (int index, int n, int p, int liste[]) {
      int start = 0;
      int i;
      if (index < p) {
        if (index > 0)
          start = liste[index-1]+1;
        for (i = start; i < n; i++) {
    	  liste[index]=i;
    	  partition(index+1,n,p,liste);
        }
      } else {
        for (i = 0; i < p; i++) {
          printf("%d ",liste[i]);
        }
        printf("\n");
      }
    }
    Et un exemple d'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int liste[3];
    partition(0,5,3,liste);
    Comme quoi, c'était pas franchement sorcier
    Merci encore à toi Scorpi0 d'avoir pris le temps de me répondre !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Stocker des sous-parties d'une chaîne : isoler les paramètres d'une commande
    Par eldoir dans le forum Free Pascal
    Réponses: 3
    Dernier message: 07/03/2012, 05h23
  2. Réponses: 0
    Dernier message: 31/05/2011, 18h47
  3. Graphes : ensemble des sous-graphes complettement liés maximaux
    Par luckyvae dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/05/2010, 23h52
  4. [AC-2002] Comment calculer des sous-totaux dans une requete croisee
    Par babinou dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/08/2009, 09h43
  5. [SBI] ensemble des sous rapports
    Par animiobi dans le forum SpagoBI
    Réponses: 0
    Dernier message: 22/03/2009, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo