Categorías
Algorithms

LeetCode – Justificación de texto (Java)

Dada una matriz de palabras y una longitud L, formatee el texto de manera que cada línea tenga exactamente L caracteres y esté completamente justificada (izquierda y derecha). Debe empaquetar sus palabras en un enfoque codicioso; es decir, empaque tantas palabras como pueda en cada línea. Rellene espacios adicionales » cuando sea necesario para que cada línea tenga exactamente L caracteres. Los espacios adicionales entre palabras deben distribuirse lo más uniformemente posible. Si el número de espacios en una línea no se divide uniformemente entre palabras, a los espacios vacíos de la izquierda se les asignarán más espacios que los espacios de la derecha. Para la última línea de texto, se debe justificar a la izquierda y no se debe insertar ningún espacio adicional entre las palabras.

Por ejemplo, palabras: [«This», «is», «an», «example», «of», «text», «justification.»]

L: 16.

Devuelve las líneas formateadas como:
[
«This is an»,
«example of text»,
«justification. «
]

Solución Java

No se requiere un algoritmo especial para resolver este problema. Para solucionar correctamente este problema, se deben tener en cuenta las siguientes situaciones:
1. Si una línea tiene solo una palabra y la longitud de la palabra es menor que el ancho máximo, necesitamos llenar la parte izquierda con espacios.
2. cómo distribuir espacios adicionales para cada palabra cuando el número de espacios no se puede distribuir uniformemente en cada palabra.

public List<String> fullJustify(String[] words, int maxWidth) {
    List<String> result = new ArrayList<String>();
 
    if(words==null || words.length==0){
        return result;
    }
 
 
    int count=0;
    int last=0;
    ArrayList<String> list = new ArrayList<String>();
    for(int i=0; i<words.length; i++){
        count = count + words[i].length();
 
        if(count+i-last>maxWidth){
            int wordsLen = count-words[i].length();
            int spaceLen = maxWidth-wordsLen;
            int eachLen = 1;
            int extraLen = 0;
 
            if(i-last-1>0){
                eachLen = spaceLen/(i-last-1);
                extraLen = spaceLen%(i-last-1);
            }
 
            StringBuilder sb = new StringBuilder();
 
            for(int k=last; k<i-1; k++){
                sb.append(words[k]);
 
                int ce = 0;
                while(ce<eachLen){
                    sb.append(" ");
                    ce++;
                }
 
                if(extraLen>0){
                    sb.append(" ");
                    extraLen--;
                }
            }
 
            sb.append(words[i-1]);//last words in the line
            //if only one word in this line, need to fill left with space
            while(sb.length()<maxWidth){
                sb.append(" ");
            }
 
            result.add(sb.toString());
 
            last = i;
            count=words[i].length();
        }
    }
 
    int lastLen = 0;
    StringBuilder sb = new StringBuilder();
 
    for(int i=last; i<words.length-1; i++){
        count = count+words[i].length();
        sb.append(words[i]+" ");
    }
 
    sb.append(words[words.length-1]);
    int d=0;
    while(sb.length()<maxWidth){
        sb.append(" ");
    }
    result.add(sb.toString());
 
    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 *