La tâche donnée est donc de créer une fonction qui vérifie toute chaîne si
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
4 Réponses :
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.
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; }
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
strstr ()
voir http://man7.org/linux/man-pages/man3/strstr.3.html 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; }
À 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; }
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
etstrstr
?