Confronto fra due stringhe per vedere se sono anagrammi

di il
17 risposte

Confronto fra due stringhe per vedere se sono anagrammi

Salve a tutti, ho un problema nel realizzare un programma che confronti due stringhe per vedere se sono anagrammi. Mentre realizzavo il programma mi sono accorto di una cosa, quando devo confrontare le due stringhe devo fare in modo che ci siano le stesse lettere, però se ad esempio inserisco le parole "oasi" e "saio" e uso un ciclo for questo confronterà il 1° elemento del 1° array con il 1° elemento del 2° array e cosi via, dunque significa che il programma rivela che (in questo caso) la lettera "o" e la lettera "s" sono diverse e di conseguenza il programma segnerà le due parole come se non fossero due anagrammi. Io avevo pensato di creare un array dove mettere le vocali di ambedue le stringhe e altrettanto con le consonanti solo che il problema è sempre li. Spero di essere stato chiaro e ringrazio in anticipo dell'aiuto. Vi lascio il codice
#include <iostream>
#include <locale>
#include <cstring>
using namespace std;
//FUNZIONER PER INSERIRE IN INPUT LE STRINGHE
void lettura_stringhe(char stringa1[30], char stringa2[30])
{
	cout << "Inserisci un testo qualsiasi:";
	cin.getline(stringa1,30);
	cout << "Inserisci un'altro testo qualsiasi:";
	cin.getline(stringa2,30);
}
//FUNZIONE PER ELIMINARE GLI SPAZI VUOTI
void eliminazione(char stringa1[30], char stringa2[30], char stringa1_pulita[30],char stringa2_pulita[30]) //Serve per eliminare gli spazi vuoti dalle stringhe
{
	int j = 0;
	int k = 0;
	int contatore_vuoti = 0; //Conta gli spazi vuoti
	int lunghezza_1 = strlen(stringa1);
	int lunghezza_2 = strlen(stringa2);
	for (int i = 0; i < lunghezza_1 ; i++)	//Pulizia 1° Stringa
	{	
		if (!isspace(stringa1[i]))
		{
			stringa1_pulita[j] = stringa1[i];
			++j;
		}	
	}cout << stringa1_pulita << endl;	
	
	for (int i = 0; i < lunghezza_1 ; i++)	//Pulizia 2° Stringa
	{	
		if (!isspace(stringa2[i]))
		{
			stringa2_pulita[k] = stringa2[i];
			++k;
		}	
	}cout << stringa2_pulita;
}
//FUNZIONE PER CONFRONTARE I DUE ARRAY
int confronto(char stringa1[30], char stringa2[30], char stringa1_pulita[30],char stringa2_pulita[30])
{	
	char vocali [5] = {'a','e','i','o','u'};
	char vocali_stringa1 [5];
	char vocali_stringa2 [5];

	
}

int main ()
{
	char stringa1[20],stringa2[20], stringa1_pulita[30], stringa2_pulita[30];
	lettura_stringhe(stringa1, stringa2);
	eliminazione(stringa1, stringa2, stringa1_pulita, stringa2_pulita);
	if (confronto(stringa1, stringa2, stringa1_pulita, stringa2_pulita) == 1 )
		cout << "Le due stringhe inserite sono anagrammi";
	else
		cout << "Le due stringhe inserite non sono anagrammi";
}

17 Risposte

  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Definisci "anagramma", con cura.
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    C'è un thread dove si parla di controllare che due insiemi siano uguali. La soluzione è identica, basta che scrivi char dove trovi double
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Ti do' un suggerimento, senza complicarti troppo la vita...

    quando vuoi confrontare due stringhe per verificare se l'una e l'anagramma dell'altra, basta che nella funzione di controllo ti crei due cicli FOR nidificati dove, nel primo FOR fai scorrere una per volta le lettere della prima stringa, nel secondo FOR nidificato fai scorrere le lettere della seconda stringa riferite sempre al primo FOR...
    In parole povere:

    - Confronti la prima lettera della prima stringa con tutte le lettere della seconda stringa...
    - successivamente...
    - Confronti la seconda lettera della prima stringa con tutte le lettere della seconda stringa...
    - Successivamente...
    - Confronti la terza lettera della prima stringa con tutte le lettere della seconda stringa...
    - e cosi via, fino ad arrivare alla fine della prima stringa...

    due FOR nidifcati ti danno questo risultato...

    P.s.
    All'interno del primo FOR puoi mettere anche un IF per controllare che esiste il carattere sia nella prima stringa che nella seconda stringa, perche' se non trova l'univocita' di caratteri, immediatamente puoi chiudere con un messaggio del tipo: "Le due stringhe non sono anagrammi".

    In questa maniera, nel caso in cui durante lo svolgimento della funzione dei due FOR di confronto, non trovi univocita' di un carattere, risparmieresti un sacco di tempo nella ricerca, perche' faresti capire immediatamente al programma che le due stringhe non sono uguali.
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Condivido quanto detto da @ramcrack, ma bisognerebbe aggiungere qualche ulteriore "controllo" affinché per esempio le parole ABA e BBA non vengano considerate anagrammi.
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Nippolo ha scritto:


    Condivido quanto detto da @ramcrack, ma bisognerebbe aggiungere qualche ulteriore "controllo" affinché per esempio le parole ABA e BBA non vengano considerate anagrammi.
    Esatto, e anche questo diventa un simpatico esercizio per il nostro amico
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Io ti direi semplicemente di eseguire un sort dei caratteri delle due stringhe e quindi confrontarle con una strcmp
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    oregon ha scritto:


    Io ti direi semplicemente di eseguire un sort dei caratteri delle due stringhe e quindi confrontarle con una strcmp
    anche questo e' un buon metodo che risolverebbe tutto d'un colpo l'annoso dilemma posto da nippolo...
    Sperando che il nostro amico sappia fare un sort di entrambe le stringhe...
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Il sort esiste già in libreria ...

    Escludendo i controlli di base (spazi, lunghezze, ... ) la faccenda potrebbe risolversi molto semplicemente ad esempio così
    
    int cmp(const void *a, const void *b)
    {
    	return (*(char*)a - *(char*)b);
    }
    
    int main()
    {
    	char s1[] = "LASTRINGASENZASPAZI";
    	char s2[] = "SENZASPAZILASTRINGA";
    	
    	qsort(s1, strlen(s1), sizeof(char), cmp);
    	qsort(s2, strlen(s2), sizeof(char), cmp);
    
    	if (strcmp(s1, s2) == 0)
    		printf("E' un anagramma");
    	else
    		printf("NON e' un anagramma");
    	
    	return 0;
    }
    
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    oregon ha scritto:


    Io ti direi semplicemente di eseguire un sort dei caratteri delle due stringhe e quindi confrontarle con una strcmp
    A questo punto tanto vale utilizzare anche la funzione sort()/qsort()... il tutto si ridurrebbe a 3 righe di codice, ma non so quanto possa essere utile, e soprattutto divertente, seguire questa strada!

    Inoltre dal punto di vista dell'efficienza il metodo illustrato in precedenza risulta decisamente preferibile.
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Nippolo ha scritto:


    ..qsort()...
    Esattamente quello che proposto nell'esempio...
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Che coincidenza!
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Nippolo ha scritto:


    Che coincidenza!
    Mah ... avendolo proposto quasi 10 minuti prima non capisco ma va bene lo stesso...
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    Salve,
    Visto che sono state proposte varie soluzioni, posso portare la mia?
    Che confrontarmi con esperti mi farà bene.
    
    int anagramma(char * s1, char * s2)
    {// 0 se non anagramma, 1 se si
       char ana[26]={0};
       int i =0;
       while(s1[i])
          {
             ana[s1[i++]-'A']++;
          }
       while(s2[i])
          {
             ana[s2[i++]-'A']--;
          }
       for(i=0;i<26;i++)
       {
          if(ana[i])
          {
             return 0;
          }
       return 1;
       }
    }
    
    dove in pratica scorro le due stringhe, conto le ricorrenze dei caratteri, a salire in un caso, a scendere nell'altro
    Ie stringhe sono anagramma solo se le 26 somme dei 26 caratteri possibili sono tutte a zero
    Con il piccolo trucco di usare il carattere stesso come indice dello array di somme
  • Re: Confronto fra due stringhe per vedere se sono anagrammi

    StandardOil ha scritto:


    Salve,
    Visto che sono state proposte varie soluzioni, posso portare la mia?
    Che confrontarmi con esperti mi farà bene.
    
    int anagramma(char * s1, char * s2)
    {// 0 se non anagramma, 1 se si
       char ana[26]={0};
       int i =0;
       
       while(s1[i])
          {
             ana[s1[i++]-'A']++
          }
       while(s2[i])
          {
             ana[s2[i++]-'A']--
          }
       for(i=0;i<26;i++)
       {
          if(ana[i])
          {
             return 0;
          }
       return 1;
       }
    }
    
    dove in pratica scorro le due stringhe, conto le ricorrenze dei caratteri, a salire in un caso, a scendere nell'altro
    Ie stringhe sono anagramma solo se le 26 somme dei 26 caratteri possibili sono tutte a zero
    E' una strada possibile. L'hai provata? Devi compilarla e testarla, altrimenti non ti accorgi di certi errori
    
    int anagramma(char * s1, char * s2)
    {// 0 se non anagramma, 1 se si
       int ana[26] = {0};
       int i = 0;
       char c;
       
       while(c = s1[i])
       {
          if(c >= 'A' && c <= 'Z')
             ana[c - 'A']++;
          else if(c >= 'a' && c <= 'z')
             ana[c - 'a']++;  
          i++;       
       }
         
       i = 0;   
       while(c = s2[i])
       {
          if(c >= 'A' && c <= 'Z')
             ana[c - 'A']--;
          else if(c >= 'a' && c <= 'z')
             ana[c - 'a']--;    
          i++;     
       }
          
       for(i=0;i<26;i++)
          if(ana[i])
             return 0;
       
       return 1;
    }
    
Devi accedere o registrarti per scrivere nel forum
17 risposte