Categorías
Algorithms

LeetCode – Distancia de palabra más corta III (Java)

Este es un problema de seguimiento de la distancia de palabra más corta. La única diferencia es que ahora word1 podría ser lo mismo que word2.

Dada una lista de palabras y dos palabras word1 y word2, devuelva la distancia más corta entre estas dos palabras en la lista.

palabra1 y palabra2 pueden ser iguales y representan dos palabras individuales en la lista.

Por ejemplo,
Suponga que palabras = [«practice», «makes», «perfect», «coding», «makes»].

Dado palabra1 = «hace», palabra2 = «codificación», devuelve 1.
Dado palabra1 = «hace», palabra2 = «hace», devuelve 3.

Solución Java 1

En este problema, palabra1 y palabra2 pueden ser iguales. Las dos variables utilizadas para realizar un seguimiento de los índices deben turnarse para actualizarse.

public int shortestWordDistance(String[] words, String word1, String word2) {
   if(words==null || words.length<1 || word1==null || word2==null)
        return 0;
 
   int m=-1;
   int n=-1;
 
   int min = Integer.MAX_VALUE;
   int turn=0;
   if(word1.equals(word2))
        turn = 1;
 
   for(int i=0; i<words.length; i++){
        String s = words[i];
        if(word1.equals(s) && (turn ==1 || turn==0)){
            m = i;
            if(turn==1) turn=2;
            if(n!=-1)
                min = Math.min(min, m-n);
        }else if(word2.equals(s) && (turn==2 || turn==0)){
            n = i;
            if(turn==2) turn =1;
            if(m!=-1)
                min = Math.min(min, n-m);
        }
   }
 
   return min;
}
  LeetCode - Ordenar colores (Java)

Solución Java 2

Podemos dividir los casos en dos: palabra1 y palabra2 son iguales y no iguales.

public int shortestWordDistance(String[] words, String word1, String word2) {
    if(words==null||words.length==0)
        return -1;
 
    if(word1==null || word2==null)
        return -1;
 
    boolean isSame = false;
 
    if(word1.equals(word2))
        isSame = true;
 
    int shortest= Integer.MAX_VALUE;
 
    int prev=-1;
    int i1=-1;
    int i2=-1;
 
    for(int i=0; i<words.length; i++){
        if(isSame){
            if(words[i].equals(word1)){
                if(prev!=-1){
                    shortest=Math.min(shortest, i-prev);
                }
                prev = i;
            }
        }else{
            if(word1.equals(words[i])){
                i1=i;
                if(i2!=-1){
                    shortest = Math.min(shortest, i-i2);
                }
            }else if(word2.equals(words[i])){
                i2=i;
                if(i1!=-1){
                    shortest = Math.min(shortest, i-i1);
                }
            }
        }
    }   
 
    return shortest;
}

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 *