Categorías
Others

LeetCode – Pares Palindrome (Java)

Dada una lista de palabras únicas. Encuentre todos los pares de índices distintos (i, j) en la lista dada, de modo que la concatenación de las dos palabras, es decir, palabras[i] + palabras[j] es un palíndromo.

Ejemplo 1:
Palabras dadas = [«bat», «tab», «cat»]

Regreso [[0, 1], [1, 0]]
Los palíndromos son [«battab», «tabbat»]

Solución Java

public List<List<Integer>> palindromePairs(String[] words) {
    List<List<Integer>> result = new ArrayList<>();
    if(words == null || words.length < 2){
        return result;
    }
 
    HashMap<String, Integer> map = new HashMap<>();
    for(int i=0; i<words.length; i++){
        map.put(words[i], i);
    }
 
    for(int i=0; i<words.length; i++){
        String s = words[i];
 
        for(int k=0; k<=s.length(); k++){
            String left = s.substring(0, k);
            String right= s.substring(k);
 
            //if left part is palindrome, find reversed right part
            if(isPalindrome(left)){
                String reversedRight = new StringBuilder(right).reverse().toString();
                if(map.containsKey(reversedRight) && map.get(reversedRight) != i){
                    ArrayList<Integer> l = new ArrayList<>();
                    l.add(map.get(reversedRight));
                    l.add(i);
                    result.add(l);
                }
            }
 
            //if right part is a palindrome, find reversed left part
            if(isPalindrome(right)){
                String reversedLeft = new StringBuilder(left).reverse().toString();
                if(map.containsKey(reversedLeft) 
                        && map.get(reversedLeft) != i 
                        && right.length() != 0){ 
                        //make sure right is not "", already handled in the if above
                    ArrayList<Integer> l = new ArrayList<>();
                    l.add(i);
                    l.add(map.get(reversedLeft));
                    result.add(l);
                }
            }
        }
    }
 
    return result;
}
 
public boolean isPalindrome(String s){
    int i=0;
    int j=s.length()-1;
 
    while(i<=j){
        if(s.charAt(i)!=s.charAt(j)){
            return false;
        }
        i++;
        j--;
    }
 
    return true;
}
  LeetCode - Kth elemento más pequeño en una matriz ordenada (Java)

La complejidad del tiempo es O (n * k ^ 2), donde n es el número de palabras y k es la longitud promedio de cada palabra.

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 *