Scambi adiacenti

di il
3 risposte

Scambi adiacenti

Salve, dovrei svolgere questo esercizio sugli scambi adiacenti, ma sicuramente dimentico qualche controllo da fare perchè il risultato mi viene errato..
Spiegazione dell'esempio
La parola "questore" appare all'interno del testo tre volte. La prima volta alla posizione 2, la parola "uqetsore" in cui sono presenti 3 scambi. La seconda volta alla posizione 43, la parola "qusetoer", in cui sono presenti 2 scambi. L'ultima volta alla posizione 64, la parola "questore" in cui non sono presenti scambi.
io avevo fatto questo metodo..
void metodo(string parola, string frase)
{
	int i=0;
	int sposto=0;
	int conto=1;
	string nuovo;
	while(sposto+parola.length()-1!=frase.length()-1)
	{
		nuovo=frase.substr(sposto,parola.length());
		for(int k=0; k<nuovo.length(); k++)
		{
			if(parola[k]==nuovo[k])
			{
				conto++;
				nuovo[k]='-';
			}
				
			else if(k==0 && parola[k]==nuovo[k+1])
			{
				nuovo[k+1]='-';
				conto++;
			} 
					
			else if(k>0 && k<=nuovo.length()-2 && parola[k]==nuovo[k+1] || parola[k]==nuovo[k-1])
			{
				if(parola[k]==nuovo[k+1])
					nuovo[k+1]='-';
				else
					nuovo[k-1]='-';
				conto++;
			}
					
			else if(k==nuovo.length()-1 && parola[k]==nuovo[k-1] )
			{
				nuovo[k-1]='-';
					conto++;
			}
					
		}
		if(parola.length()==conto)
		{
			cout<<sposto<<" ";
		}
		sposto++;
		conto=1;
	}

}

3 Risposte

  • Re: Scambi adiacenti

    Vedo un possibile errore in
    
    else if(k>0 && k<=nuovo.length()-2 && parola[k]==nuovo[k+1] || parola[k]==nuovo[k-1])
    
    perchè l'operatore && ha precedenza maggiore rispetto a ||, se ho capito il tuo algoritmo dovresti aggiungere delle parentesi (e k>0 è inutile perchè usi "else")
    
    else if(k<=nuovo.length()-2 && (parola[k]==nuovo[k+1] || parola[k]==nuovo[k-1]))
    
    Per ora altri errori non ne vedo
  • Re: Scambi adiacenti

    Adesso l'ho cambiato così, sull'esempio funziona, ma su altri input a volte restituisce valori esatti, a volte no..
    void metodo(string parola, string frase)
    {
    	int i=0;
    	int sposto=0;
    	int conto=0;
    	string nuovo;
    	while(sposto+parola.length()-1!=frase.length()-1)
    	{
    		nuovo=frase.substr(sposto,parola.length());
    		for(int k=0; k<nuovo.length(); k++)
    		{
    			if(parola[k]==nuovo[k])
    			{
    				conto++;
    				nuovo[k]='-';
    			}
    				
    			else if(k==0 && parola[k]==nuovo[k+1])
    			{
    				nuovo[k+1]='-';
    				conto++;
    			} 
    					
    			else if(k>0 && k<=nuovo.length()-2)
    			{
    				if(parola[k]==nuovo[k+1])
    				{
    					conto++;
    					nuovo[k+1]='-';
    				}
    					
    				else if(parola[k]==nuovo[k-1])
    				{
    					nuovo[k-1]='-';
    					conto++;
    				}
    			}
    					
    			else if(k==nuovo.length()-1 && parola[k]==nuovo[k-1] )
    			{
    				nuovo[k-1]='-';
    					conto++;
    			}
    					
    		}
    		if(nuovo.length()==conto)
    		{
    			out<<sposto<<" ";
    		}
    		sposto++;
    		conto=0;
    	}
    
    }
  • Re: Scambi adiacenti

    Vedo un altro errore,
    
    while(sposto+parola.length()-1!=frase.length()-1)
    
    Dovresti iterare una volta in più, se la parola è a fine frase la perdi, quindi o togli il -1 di destra o metti <=
    In ogni caso dovresti cercare di fornire più dettagli sull'errore, ad esempio se dà in output troppi numeri o se i numeri errati seguono un qualche pattern.
    P.S. se la condizione dentro quel while fosse giusta, quei -1 da ambo le parti dell'uguale sarebbero superflui (algebra delle medie )
Devi accedere o registrarti per scrivere nel forum
3 risposte