Categorías
Algorithms Interview Java

LeetCode – Secuencias de ADN repetidas (Java)

Problema

Todo el ADN está compuesto por una serie de nucleótidos abreviados como A, C, G y T, por ejemplo: «ACGAATTCCG». Al estudiar el ADN, a veces es útil identificar secuencias repetidas dentro del ADN.

Escribe una función para encontrar todas las secuencias de 10 letras (subcadenas) que ocurren más de una vez en una molécula de ADN.

Por ejemplo, dado s = «AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT», devuelve: [«AAAAACCCCC», «CCCCCAAAAA»].

Solución Java

La clave para resolver este problema es que cada uno de los 4 nucleótidos se puede almacenar en 2 bits. Por lo tanto, la secuencia de 10 letras se puede convertir en un número entero de 20 bits. La siguiente es una solución de Java. Puede usar un ejemplo para ejecutar manualmente el programa y ver cómo funciona.

public List<String> findRepeatedDnaSequences(String s) {
    List<String> result = new ArrayList<>();
    if(s==null||s.length()<10){
        return result;
    }
 
    HashMap<Character, Integer> dict = new HashMap<>();
    dict.put('A', 0);
    dict.put('C', 1);
    dict.put('G', 2);
    dict.put('T', 3);
 
    int hash=0;      
    int mask = (1<<20) -1;
 
    HashSet<Integer> added = new HashSet<>();
    HashSet<Integer> temp = new HashSet<>();
 
    for(int i=0; i<s.length(); i++){
        hash = (hash<<2) + dict.get(s.charAt(i));
 
        if(i>=9){
            hash&=mask;
            if(temp.contains(hash) && !added.contains(hash)){
                result.add(s.substring(i-9, i+1));
                added.add(hash);
            }
 
            temp.add(hash);
        }
    }
 
    return result;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *