3
votes

C: Comment trouver qu'un certain nombre de caractères sont présents dans une chaîne dans n'importe quelle séquence?

La tâche donnée est donc de créer une fonction qui vérifie toute chaîne si

  1. Les 5 lettres 'a', 'b', 'c', 'd' et 'e' sont incluses (dans tout séquence) et
  2. La chaîne 'abcde' est une sous-chaîne de la chaîne donnée. Si 1 tient (mais pas 2), renvoie 1. Si 1 et 2 sont vérifiés, renvoyez 2. Sinon, renvoyez 0.

Exemples:

int checkabcde(char str[]) {

  char str2[] = {
    'a',
    'b',
    'c',
    'd',
    'e'
  };

  char str3[5]; //to be filled with elements from str2 when found inconsecutive order

  int i, z, x, f;

  z = 0; //position for str3
  f = 0; //flag for similarity comparison of str2 and str3

  for (i = 0; i < strlen(str); i++) {
    for (x = 0; x < strlen(str2); x++) {
      if (str[i] == str2[x]) {

        if ((str[i] == 'a') && (str[i + 1] == 'b') && (str[i + 2] == 'c') && (str[i + 3] == 'd') && (str[i + 4] == 'e')) {
          return 2;
        } else {

          if (str3[z] != str[z - 1]) {
            str3[z] = str2[x];
            z++;
          }

        }

      }
    }
  }

  for (i = 0; i < 5; i++) {
    for (x = 0; x < 5; x++) {
      if (str2[i] == str3[x]) {
        f++;
      }
    }
  }

  if (f == 5) {
    return 1;
  } else if (f1 == 0) {
    return 0;
  }
}

Dans mon approche, j'ai pu trouver que la sous-chaîne est "abcde" mais incapable de déterminer que la chaîne contient 'a', 'b', 'c', 'd', 'e' dans n'importe quelle séquence

checkabcde(“someaxbxcxdxemm”) -> 1
checkabcde(“someOtherValue”) -> 0
checkabcde(“xyabcdeping”) -> 2
checkabcde(“someaxuxdxlxammabcde”) -> 2

edit: pointeurs non autorisés


2 commentaires

Itérer et compter les caractères? Faites un tableau de nombres de la longueur de votre alphabet et incrémentez le nombre pour chaque caractère rencontré. Vérifiez ensuite ceux qui vous intéressent. Optimisez-le ensuite en supprimant les compteurs inutiles ...


Êtes-vous autorisé à utiliser strchr et strstr ?


4 Réponses :


1
votes

Vous pouvez utiliser une structure distincte pour vérifier les caractères individuels en plus de rechercher la sous-chaîne.

Un tableau de cinq booléens pourrait être utilisé pour stocker le présent de chaque caractère. par exemple:

bool chars[5] = {false};

for (int i = 0; i < strlen(str); i++) {
    char c = str[i];
    switch(c) {
        case 'a':
            chars[0] = true;
            break;
        case 'b':
            chars[1] = true;
            break;
        // include cases for each character you are looking for
    }
}

Si à la fin chaque entrée du tableau chars est vraie, vous savez que la chaîne contient tous les caractères.

Vous pouvez le faire en plus de ce que vous faites déjà pour faire correspondre la sous-chaîne.

Vous pouvez également consulter quelques autres méthodes pour vérifier si une chaîne contient une certaine sous-chaîne.


0 commentaires

1
votes

Essayez quelque chose comme ceci:

int checkabcde(char str[]) {

    // Check if string contains substring "abcde"
    if (strstr(str, "abcde") != NULL) {
        return 2;
    }

    int charCounts[5] = {0, 0, 0, 0, 0};
    int length = strlen(str);
    int i = 0;

    // Keep counts of each occurrence of a,b,c,d,e
    for(; i < length; i++) {
        // If "abcde" contains the current character
        if (strchr("abcde", str[i]) != NULL) {
            charCounts[str[i] - 'a']++;
        }
    }

    i = 0;

    // Check if any of the counts for a,b,c,d,e are 0
    for (; i < 5; i++) {
        if (charCounts[i] == 0) {
            return 0;
        }
    }

    // Otherwise we must have found at least 1 of each a,b,c,d,e
    return 1;
}


0 commentaires

2
votes
  1. Pour 1, vous pouvez utiliser f [256] set f [ch] = 1 pour tous les caractères de s1 puis vérifier si f [ch] == 1 pour chaque caractère de s2
  2. Pour 2, vous pouvez utiliser strstr () voir http://man7.org/linux/man-pages/man3/strstr.3.html
  3. Le code suivant pourrait fonctionner:

    #include <stdio.h>
    #include <string.h>
    
    int check(const char* s1, const char* s2) {
      int f[256];
      memset(f, 0, sizeof(f));
    
      // check 1
      for (int i = 0; s1[i] != '\0'; ++i)
        f[s1[i]] = 1;
      for (int i = 0; s2[i] != '\0'; ++i)
        if (f[s2[i]] == 0)
          return 0;
      // check 2
      return strstr(s1, s2) == NULL ? 1 : 2;
    }
    
    int main(void) {
      printf("%d\n", check("someaxbxcxdxemm",      "abcde"));
      printf("%d\n", check("someOtherValue",       "abcde"));
      printf("%d\n", check("xyabcdeping",          "abcde"));
      printf("%d\n", check("someaxuxdxlxammabcde", "abcde"));
      return 0;
    }
    

0 commentaires

0
votes

À chaque index de str , la boucle sub recherche la correspondance de sous-chaîne. S'il est trouvé, 2 est renvoyé. La boucle found cherche à voir si ce caractère, str [index], est l'un des abcde . Si tel est le cas, l'index correspondant dans le tableau check est défini sur espace.
Une fois que tous les caractères de str ont été traités, comparez abcde à check . S'il y a une correspondance, ce caractère correspondant est manquant dans str . Renvoie 0.

#include <stdio.h>
#include <string.h>

int checkabcde ( char str[]) {
    char abcde[] = "abcde";
    char check[] = "abcde";
    int index = 0;
    int match = 1;
    int length = strlen ( str);
    int span = strlen ( abcde);

    while ( str[index]) {
        if ( str[index] == abcde[0]) {
            match = 1;
            for ( int sub = 0; sub < span; ++sub) {
                if ( index + sub > length || str[index + sub] != abcde[sub]) {
                    match = 0;
                    break;
                }
            }
            if ( match) {
                return 2;
            }
        }
        for ( int found = 0; index + found < length && found < span; ++found) {
            if ( str[index + found] == abcde[found]) {
                check[found] = ' ';
            }
        }
        index++;
    }
    for ( int found = 0; found < span; ++found) {
        if ( check[found] == abcde[found]) {
            return 0;
        }
    }
    return 1;
}

int main( void) {
    char lines[][30] = {
        "someaxbxcxdxemm"
        , "someOtherValue"
        , "xyabcdeping"
        , "someaxuxdxlxammabcde"
        , "vu4ndljeibn2c9n@aiendjba"
        , "dbcaeddeaabcceabcde"
    };

    for ( int each = 0; each < 6; ++each) {
        printf ( "for [%s] result = %d\n", lines[each], checkabcde ( lines[each]));
    }
    return 0;
}


0 commentaires