Estratto del documento

Esercizio di laboratorio

Argomento: manipolazione di stringhe, passaggio di parametri dalla riga di comando

Scrivere un programma che identifichi la più lunga sottostringa appartenente a due stringhe ricevute come argomenti sulla riga di comando.

Esempio: la più lunga sottostringa comune alle due stringhe PippoPluto2PaperinoMinnieAiuzzto2Zoè la stringa to2

Osservazione: questo è un caso particolare di un problema più generale, ovvero la ricerca della più lunga sottosequenza comune tra due stringhe. Si tratta di un problema molto interessante in applicazioni biologiche, in particolare nello studio del DNA. Un filamento di DNA è composto da molecole chiamate basi, e le basi possibili sono quattro: adenina (abbreviata con la lettera A), citosina (C), guanina (G) e timina (T). Dunque un filamento di DNA è rappresentabile come una stringa composta con l'alfabeto dei quattro caratteri {A,C,G,T}. Una buona misura della somiglianza tra due filamenti di DNA (ovvero della somiglianza tra due organismi) è data proprio dalla lunghezza della massima sottosequenza comune tra i due filamenti ...

Soluzione

Osservare la costruzione dei due cicli annidati (for e while), che realizzano l'algoritmo descritto.

public class MaxSubstringFinder{

public static void main(String[] args){

if (args.length != 2){

System.out.println("Uso: $java <stringa1> <stringa2>");

System.exit(1);

}

String s1 = args[0];

String s2 = args[1];

String max = ""; // conterrà la massima sottostringa comune

int start1 = 0; // conterrà l'indice di inizio di max in s1

int start2 = 0; // conterrà l'indice di inizio di max in s2

// i e' l'indice di inizio della sottostringa in s1

for (int i = 0; i < s1.length(); i++){

// j e' l'indice di inizio della sottostringa in s2

for (int j = 0; j < s2.length(); j++){

int k = 0; // k e' la lunghezza della sottostringa in esame

boolean isInSubstring = true; // è true se il char in

//esame è nella sottostringa

while (isInSubstring && i+k < s1.length() && j+k < s2.length()){

if (s1.charAt(i+k) != s2.charAt(j+k)) //la sottostringa

isInSubstring = false; //comune e' finita

else

k++;

}

if (k > max.length()) // trovata una sottostringa comune più

{ // lunga della precedente

max = s1.substring(i, i+k);

start1 = i;

start2 = j;

}

}

}

System.out.println("Massima sottostringa comune: \"" + max +"\"");

System.out.println("Indice iniziale in s1: " + start1);

System.out.println("Indice iniziale in s2: " + start2);

}

}

Anteprima
Vedrai una selezione di 1 pagina su 1
Informatica I - Esercizi sottostringhe Pag. 1
1 su 1
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher enricopava di informazioni apprese con la frequenza delle lezioni di Informatica 1 e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Padova o del prof Avanzini Federico.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community