LeetCode-Python-1392. El prefijo feliz más largo (método de fuerza bruta + hash de cadena)

"Happy Prefix" es una cadena que es a la vez un prefijo no vacío y un sufijo (excluyendo la cadena original) en la cadena original.

Darle una cadena s, devuelva su prefijo feliz más largo.

Si no hay un prefijo que satisfaga el título, se devuelve una cadena vacía.

 

Ejemplo 1:

Entrada: s = "nivel"
Salida: "l"
Explicación: Excluyendo s, hay 4 prefijos ("l", "le", "lev", "leve") y 4 sufijos ("l", "el", "vel", "evel"). La cadena más larga con prefijo y sufijo es "l".
Ejemplo 2

Entrada: s = "ababab"
Salida: "abab"
Explicación: "abab" es la cadena más larga que es tanto un prefijo como un sufijo. El título permite que el prefijo y el sufijo se superpongan en la cadena original.
Ejemplo 3

Entrada: s = "leetcodeleet"
Salida: "leet"
Ejemplo 4:

Entrada: s = "a"
Salida: ""
 

Consejos:

1 <= s.length <= 10 ^ 5
s contiene solo letras minúsculas en inglés

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/longest-happy-prefix Los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

La primera idea:

Después de que se resolvió la violencia, lo probé, ¡pero podría pasarlo!

Complejidad del tiempo: O (N ^ 2)

Complejidad espacial: O (N)

class Solution(object):
    def longestPrefix(self, s):
        """
        :type s: str
        :rtype: str
        """
        res = ""
        for i in range(len(s) -1, -1, -1):
            if s[:i] == s[-i:]:
                res = s[:i]
                break
        return res if res != s else ""

La segunda idea:

El algoritmo en el hash de cadena,

Convierta cada cadena en un número en el sistema P y luego en el módulo M para calcular un valor hash.

A través de los valores apropiados de P y M, cada cadena y valor hash deben corresponder entre sí tanto como sea posible, de modo que cada vez que compare números, pueda saber si las cadenas son iguales en el tiempo O (1).

Aquí P = 131 y M = 10 ** 9 + 7.

1. Para calcular el valor del prefijo,

Dado que el valor hash de s [: i] es h (i), entonces el valor hash de s [: i + 1] es h (i + 1) = (h (i) * P + s [i])% M

Similar al sistema decimal, el número actual es 56 y se agrega un nuevo 3 en el extremo derecho. El resultado es (56 * 10 + 3)% 10 = 563.

2. Para calcular el valor del sufijo, se necesita una variable adicional múltiple para registrar el nuevo múltiplo más alto de la base

suffix_new = (nueva letra * multiple + suffix_old)% M,

Similar al sistema decimal, el número actual es 34, y se agrega un nuevo 2 al lado más a la izquierda. Se sabe que el nuevo 2 corresponde a cien dígitos.

Entonces el resultado es (2 * 100 + 34)% 10 = 234

Complejidad del tiempo: O (N)

Complejidad espacial: O (1)

class Solution(object):
    def longestPrefix(self, s):
        """
        :type s: str
        :rtype: str
        """
        base = 131
        mod = 10 ** 9 + 7
        res = ""
        prefix, suffix = 0, 0
        multiple = 1
        for i in range(len(s) - 1):
            prefix = (prefix * base + ord(s[i])) % mod 
            suffix = (ord(s[-(i + 1)]) * multiple + suffix) % mod 
            if prefix == suffix:
                res = s[:i + 1]
            
            multiple = multiple * base % mod

        return res

 

Publicado 734 artículos originales · 121 alabanzas · 210,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_32424059/article/details/105139418
Recomendado
Clasificación