LeetCode 990. La satisfacibilidad de las ecuaciones [Python]

problema

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.

Ejemplo 1:

Entrada: ["a == b", "b! = A"]
Salida: falso
Explicación: Si especificamos que a = 1 y b = 1, entonces la primera ecuación puede satisfacerse, pero la segunda ecuación no puede satisfacerse. No hay forma de asignar variables para satisfacer ambas ecuaciones al mismo tiempo.

Ejemplo 2:

Salida: ["b == a", "a == b"]
Entrada: verdadero
Explicación: Podemos especificar a = 1 y b = 1 para satisfacer estas dos ecuaciones.

Ideas

Resuelva utilizando el conocimiento de búsqueda de sindicatos .
(1) Juzgue cada expresión en el conjunto; cuando "==", debe asignar el número de la primera letra de juicio en el alfabeto al segundo valor [habrá una búsqueda recursiva más tarde], cuando "! =", Si hay dos letras cuyas condiciones de juicio no son iguales, pero cuando los números en el alfabeto son iguales, devuelve Falso. Después de recorrer la lista, si no hay ninguna excepción, devuelve True.
(2) Es necesario asegurarse de que el juicio de "! =" Sea posterior a "==". [ ¡Atención! ! !

Código

class Solution:
    def equationPossible(self, equations):
        self.p = [i for i in range(26)]  # “数字”字母表
        for eq in equations:
            # '=='
            for i in eq:
                if eq[1] == '=':
                    r1 = self.find(ord(eq[0]) - ord('a'))   
                    r2 = self.find(ord(eq[3]) - ord('a'))
                    if r1 != r2:
                        self.p[r2] = r1

        for eq in equations:
            # '!='
            for i in eq:
                if eq[1] == '!':
                    r1 = self.find(ord(eq[0]) - ord('a'))
                    r2 = self.find(ord(eq[3]) - ord('a'))
                    if r1 == r2:
                        return False
        return True

    def find(self, x):
        if x == self.p[x]:
            return self.p[x]
        else:
            self.p[x] = self.find(self.p[x])  # 寻找最初赋值【递归查找】
            return self.p[x]

if __name__ == '__main__':
    ep1 = Solution()
    r = ep1.equationPossible(['a==b', 'b!=c', 'c==a'])
    print(r)
información relacionada
# ord()函数返回参数对应的ASCII 数值
# ord(c)  c 为字符,返回值是对应的十进制整数。
>>>ord('a')
97
>>> ord('b')
98
>>> ord('c')
99

Supongo que te gusta

Origin blog.csdn.net/qq_41709378/article/details/106629700
Recomendado
Clasificación