
Originariamente inviata da
Cetty93
Ho corretto i e l'ho inizializzato a 0. Come potrei semplificarlo??
Oltre al valido metodo suggerito dal giovane Scara95, un approccio risolutivo da considerare perché fortemente paradigmatico del problem solving discreto è il seguente:
codice:
#define ALPHA_SIZE 26
#define STR_SIZE 16
...
char s1[STR_SIZE], s2[STR_SIZE];
size_t alpha[ALPHA_SIZE];
size_t i, sz1, sz2;
memset(alpha, 0, ALPHA_SIZE * sizeof(size_t));
...
sz1 = strlen(s1);
for (i = 0; i < sz1; ++i)
{
++alpha[s1[i] - 'a'];
--alpha[s2[i] - 'a'];
}
printf("\nLa parola \"%s\"", s1);
for (i = 0; i < ALPHA_SIZE; ++i)
{
if(alpha[i] != 0)
{
printf(" non");
break;
}
}
printf(" e' anagramma di \"%s\"\n", s2);
In questo caso (dopo essersi accertati che le parole immesse abbiano identica lunghezza e contengano solo caratteri alfabetici minuscoli, ma tale codice - assieme a quello che impedisce potenziali overflow dei buffer di stringa - è stato deliberatamente escluso al fine di semplificare la lettura) si impiega un unico array delle occorrenze e si sfrutta il principio della somma (algebrica) pesata, assegnando nello specifico peso unitario ma negativo ad uno dei due contatori.
Se per ogni carattere alfabetico presente nelle due stringhe immesse le occorrenze totali sono uguali, è ovvio che il relativo contatore deve risultare ancora nullo al termine della scansione, rendendo facilissimo (e potenzialmente anche più efficiente, su molte architetture) rilevare i simmetrici casi di disuguaglianza.