El problema del biólogo en Java



Objetivos

  • Manejo de cadenas
  • Bucles o iteraciones


Enunciado del problema

Eres un biólogo que examina secuencias de ADN de formas de vida diferentes. Se te darán dos secuencias de ADN, y el objetivo es encontrar el conjunto ordenado de bases adyacentes de mayor tamaño que es común en ambos ADNs.

Las secuencias de ADN se darán como conjuntos ordenados de bases de nucleótidos: adenina (abreviado A), citosina (C), guanina (G) y timina (T):

Secuencia 1: ATGTCTTCCTCGA 
Secuencia 2: TGCTTCCTATGAC

Para el ejemplo anterior, el resultado es CTTCCT porque que es el conjunto ordenado de bases adyacentes de mayor tamaño que se encuentra en ambas formas de vida.


Código completo


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class JavaBiologo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        //variable que almacena la primera secuencia de adn
        String  adn1 = "ATGTCTTCCTCGA";
        
        //variable que almacena la segunda secuencia de adn
        String  adn2 = "TGCTTCCTATGAC";      
        
        //variable que almacena el resultado. El conjunto ordenado de bases 
        //adyacentes de mayor tamaño que es común en amba secuencias
        String bases = "";
          
        
        //Utilizamos dos iteraciones for para realizar la búsqueda. El enfoque
        //que utilizaremos es encontrar la mayor cadena en la variable adn1
        //que tambien se encuentra en la variable adn2
          
        
        //el primer for irá acotando de derecha a izquierda el rango de búsqueda
        //el contador comienza en el valor de la longitud de la variable adn1
        //va disminuyendo
        for (int r = adn1.length(); r >= 0; r--) {
            
            //el segundo for irá acotando de izquierda a derecha el rango 
            //de búsqueda. El contador comienza en cero y se va incrementando
            //sin llegar a ser igual que el valor actual de la variable r
            //que viene acotando por la derecha
            for (int l = 0; l < r; l++) {
                
                //aquí verificamos dos condiciones:
                
                //1. que la porción de la cadena extraida de la variable adn1 
                //se encuentra en la variable adn2
                if (adn2.contains(adn1.substring(l, r)) && 
                
                //2. que la longitud de la ultima coincidencia encontrada
                //sea menor a la longitud de la nueva coincidencia encontrada
                    bases.length() < adn1.substring(l, r).length()) {
                  
                  //si se cumplen ambas condiciones almacenamos el nuevo valor  
                  bases = adn1.substring(l, r);
                  
                }
                
            }
            
        }
        
        //finalmente imprimimos el resultado en pantalla
        System.out.println(bases);
        
    }
    
}

Referencias

Comentarios