Categorías
Algorithms

Subcadena más larga con como máximo K caracteres distintos

Este es un problema solicitado por Google.

Dada una cadena, busque la subcadena más larga que contenga solo dos caracteres únicos. Por ejemplo, dado «abcbbbbcccbdddadacb», la subcadena más larga que contiene 2 caracteres únicos es «bcbbbbcccb».

1. Subcadena más larga que contiene 2 caracteres únicos

En esta solución, se usa un mapa hash para rastrear los elementos únicos en el mapa. Cuando se agrega un tercer carácter al mapa, el puntero izquierdo debe moverse hacia la derecha.

Puede utilizar «abac» para recorrer esta solución.

public int lengthOfLongestSubstringTwoDistinct(String s) {
    int max=0;
    HashMap<Character,Integer> map = new HashMap<Character, Integer>();
    int start=0;
 
    for(int i=0; i<s.length(); i++){
        char c = s.charAt(i);
        if(map.containsKey(c)){
            map.put(c, map.get(c)+1);
        }else{
            map.put(c,1);
        }
 
        if(map.size()>2){
            max = Math.max(max, i-start);
 
            while(map.size()>2){
                char t = s.charAt(start);
                int count = map.get(t);
                if(count>1){
                    map.put(t, count-1);
                }else{
                    map.remove(t);
                }
                start++;
            }
        }
    }
 
    max = Math.max(max, s.length()-start);
 
    return max;
}

Ahora bien, si esta pregunta se amplía para ser «la subcadena más larga que contiene k caracteres únicos», ¿qué debemos hacer?

2. Solución para K caracteres únicos

Se corrige la siguiente solución. Dado «abcadcacacaca» y 3, devuelve «cadcacacaca».

public int lengthOfLongestSubstringKDistinct(String s, int k) {
    int result = 0;
    int i=0;
    HashMap<Character, Integer> map = new HashMap<Character, Integer>();
 
    for(int j=0; j<s.length(); j++){
        char c = s.charAt(j);
        if(map.containsKey(c)){
            map.put(c, map.get(c)+1);
        }else{
            map.put(c, 1);
        }
 
        if(map.size()<=k){
            result = Math.max(result, j-i+1);
        }else{
            while(map.size()>k){
                char l = s.charAt(i);
                int count = map.get(l);
                if(count==1){
                    map.remove(l);
                }else{
                    map.put(l, map.get(l)-1);
                }
                i++;
            }
        }
 
    }
 
    return result;
}
  LeetCode - Juego Flip (Java)

El tiempo es O (n).

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 *