[Pregunta de pincel de algoritmo] Solución del problema de subcadena de palíndromo más largo de Leetcode

Problema: 5. La subcadena palindrómica más larga

[TOC]

tren de pensamiento

Al ver la cuestión de encontrar la subcadena de palíndromo más larga, el primer pensamiento es resolverlo violentamente.
Use un primer puntero para ubicar el cabezal del hilo y luego pruebe hacia atrás desde la primera posición +1

método de resolución de problemas

Python mismo proporciona [::-1] para la transposición de cadenas, por lo que a través de la cadena entre la posición de inicio y el cursor, después de dividirse con [:], se juzga si la cadena es un palíndromo.
Aquí max_length se usa para guardar temporalmente la cadena más larga y evitar bucles repetidos en el bucle while.

la complejidad

  • complejidad del tiempo:

Agregar complejidad de tiempo, ejemplo: O ( nlogn ) O(nlogn)O ( n log n ) _ _

  • Complejidad del espacio:

Añadir complejidad de espacio, ejemplo: O ( 1 ) O(1)O ( 1 )

Código


class Solution:
    def longestPalindrome(self, s: str) -> str:
        start_index = 0
        end_index = len(s)
        max_length = 0

        flag_start = 0
        flag_end = 0

        if len(s) == 1:
            return s

        while start_index <= end_index and end_index - start_index > max_length:
            for cursor in range(0,len(s)+1):
                if s[start_index:cursor] == s[start_index:cursor][::-1]:
                    if cursor-start_index > max_length:
                        max_length = cursor-start_index
                        flag_start = start_index
                        flag_end = cursor
            start_index = start_index + 1
        return (s[flag_start:flag_end])
            

[mejoramiento]

Algoritmo de difusión central

Más tarde, vi el algoritmo de optimización del algoritmo de difusión central para la determinación de esta cadena palíndromo, que puede optimizar la complejidad temporal del peor caso de n^2.
El algoritmo de difusión central es equivalente a permitir que la cadena se difunda y detecte en ambos lados, y el método mencionado anteriormente tiene y solo puede detectar hacia atrás, por lo que es necesario agregar un cursor para detectar hacia adelante.

método de resolución de problemas

Después de estudiar cuidadosamente el algoritmo de difusión central, de hecho, mi algoritmo puede lograr resultados similares en términos de eficiencia ligeramente optimizada.
Max_length está reservado en el algoritmo de difusión central.Si se ha definido max_length, cuando busque la cadena más larga, puede buscar directamente la cadena de palíndromo recorriendo longitudes max_length desde mid_cursor a ambos lados.

la complejidad

  • complejidad del tiempo:

Agregue complejidad de tiempo, ejemplo: O ( n ) O(n)O ( n )

  • Complejidad del espacio:

Añadir complejidad de espacio, ejemplo: O ( 1 ) O(1)O ( 1 )

Código

class Solution:
    def longestPalindrome(self, s: str) -> str:
        start_index = 0
        end_index = len(s)
        max_length = 0

        flag_start = 0
        flag_end = 0

        if len(s) == 1:
            return s

        while start_index <= end_index and end_index - start_index > max_length:
            for cursor in range(max_length,len(s)+1):
                if s[start_index:cursor] == s[start_index:cursor][::-1]:
                    if cursor-start_index > max_length:
                        max_length = cursor-start_index
                        flag_start = start_index
                        flag_end = cursor
            start_index = start_index + 1
        return (s[flag_start:flag_end])


            

Supongo que te gusta

Origin blog.csdn.net/qq_27180763/article/details/129459973
Recomendado
Clasificación