Categorías
Algorithms

LeetCode – Reorganizar cadena k distancia aparte (Java)

Dada una cadena no vacía str y un entero k, reorganice la cadena de modo que los mismos caracteres estén al menos a una distancia k entre sí.

Todas las cadenas de entrada se dan en minúsculas. Si no es posible reorganizar la cadena, devuelva una cadena vacía «».

Ejemplo:

str = "aabbcc", k = 3

Result: "abcabc"

The same letters are at least distance 3 from each other.

Solución Java

public String rearrangeString(String str, int k) {
    if(k==0)
        return str;
 
    //initialize the counter for each character
    final HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    for(int i=0; i<str.length(); i++){
        char c = str.charAt(i);
        if(map.containsKey(c)){
            map.put(c, map.get(c)+1);
        }else{
            map.put(c, 1);
        }
    }
 
    //sort the chars by frequency
    PriorityQueue<Character> queue = new PriorityQueue<Character>(new Comparator<Character>(){
        public int compare(Character c1, Character c2){
            if(map.get(c2).intValue()!=map.get(c1).intValue()){
                return map.get(c2)-map.get(c1);
            }else{
                return c1.compareTo(c2);
            }
        }
    });
 
 
    for(char c: map.keySet())
        queue.offer(c);
 
    StringBuilder sb = new StringBuilder();
 
    int len = str.length();
 
    while(!queue.isEmpty()){
 
        int cnt = Math.min(k, len);
        ArrayList<Character> temp = new ArrayList<Character>();
 
        for(int i=0; i<cnt; i++){
            if(queue.isEmpty())
                return "";
 
            char c = queue.poll();
            sb.append(String.valueOf(c));
 
            map.put(c, map.get(c)-1);
 
            if(map.get(c)>0){
                temp.add(c);
            }
 
            len--;
        }
 
        for(char c: temp)
            queue.offer(c);
    }
 
    return sb.toString();
}

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 *