LeetCode990. La satisfacibilidad de la ecuación

tema

Dada una matriz de ecuaciones de cadena que representan la relación entre variables, cada ecuación de ecuación de cadena [i] tiene una longitud de 4 y toma una de dos formas diferentes: "a == b" o "a ! = b ". Aquí, ayb son letras minúsculas (no necesariamente diferentes), que representan nombres de variables de una sola letra.
Solo cuando se pueda asignar un número entero al nombre de la variable para satisfacer todas las ecuaciones dadas, devolverá verdadero; de lo contrario, devolverá falso.
enlace

Ideas

  • No sé cómo revisar la colección. Debería haberlo escuchado antes, pero no puedo escribirlo. Después de leer la solución, se siente un poco como una muñeca (/ perro).
  • En realidad la idea es mejor, las ecuaciones son transitivas, se agrupa el mismo grupo, finalmente se recorren las desigualdades para encontrar si son contradictorias de acuerdo con los resultados iguales pasados ​​por las ecuaciones anteriores.
    La clave es cómo agrupar y cómo asegurarse de que pertenecen al mismo conjunto. Esta estructura de datos combinada es más conveniente (derrama lágrimas de ignorancia).
  • El conjunto de consultas de unión se implementa mediante una matriz. El valor del subíndice representa el valor del nodo, y el valor de la matriz se almacena en el nodo principal (si está de acuerdo con el árbol, pero de hecho, estos son los nodos intermedios que conectan el nodo raíz, lo que representa que pertenecen al mismo conjunto , Al concatenar valores y subíndices), esta pregunta usa letras minúsculas en ambos lados de la ecuación, por lo que se almacena en una matriz de longitud 26. Primero recorre todas las ecuaciones y fusiona las iguales en un conjunto, y luego recorre las desigualdades para juzgar la contradicción.
    Solución detallada del problema del hermano mayor de Weiwei
class Solution {
    
    
    private int[]parent=new int[26];
    public boolean equationsPossible(String[] equations) {
    
    
        for(int i=0;i<26;i++){
    
    
            parent[i]=i;
        }
        for(String s:equations){
    
    
            char[]cs=s.toCharArray();
            if(cs[1]=='='){
    
    
                union(cs[0]-'a',cs[3]-'a');
            }
        }
        for(String s:equations){
    
    
            char[]cs=s.toCharArray();
            if(cs[1]=='!'){
    
    
                if(find(cs[0]-'a')==find(cs[3]-'a')){
    
    
                    return false;
                }
            }
        }
        return true;
    }

    private void union(int idx1,int idx2){
    
    
    	//这个地方,归并到谁都行,只要idx1和idx2属于一个集合
        parent[find(idx2)]=find(idx1);
    }
	//查找idx的根节点
    private int find(int idx){
    
    
        while(parent[idx]!=idx){
    
    
        	//隔代路径压缩,详细参考大佬题解
            parent[idx]=parent[parent[idx]];
            idx=parent[idx];
        }
        return idx;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_42007742/article/details/106615904
Recomendado
Clasificación